Problem: 1. MSVC creates different symbols for "extern const ex _ex0" if it is declared at top-level (inside GiNaC namespace) and if it is declared inside the body of a function (also inside GiNaC namespace). When linking, unresolved external symbols occur. 2. utils.h declares _num_1_p as const, but parse_binop_rhs.cpp omits the const. MSVC creates different symbols for the two versions, causing linking errors 3. parser.cpp mentions extern numeric* _num_1_p; extern ex _ex0; which cause linking problems Solution: 1. Moved the declaration out of the body of the function 2. added the const 3. omitted them because the code compiles without them (probably adding a const would also solve the problem) Note to 2: [basic.type.qualifier] says: \begin{quote} The cv-qualified or cv-unqualified versions of a type are distinct types; however, they shall have the same representation and alignment requirements (3.9)^46) 46) The same representation and alignment requirements are meant to imply interchangeability as arguments to functions, return values from functions, and members of unions. \end{quote} It is not clear how it's possible for cv-qualified and non-cv-qualified type to have different mangled names without violating the above requirements, but anyway - MSVC can do it :-)