Hi, Jan! 2010/9/10 Jan private <jrheinlaender@gmx.de>:
Problem: 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.
Solution: Moved the declaration out of the body of the function
I'm afraid your patch is incorrect. The ex.h file is public, and utlis.h is not (i.e. it's not supposed to be used by programs using GiNaC, and as you might notice it is not even installed). In other words, utils.h is supposed to contain internal functions/variables which should not be exposed to GiNaC users. Therefore including utils.h from ex.h is just plain wrong. Also, moving declaration of _ex0 from the ex::ex() ctor scope for all compilers is not wellcome. _ex0 should not be exposed to user code (in the past that caused quite a number of problems due to static initialization order fiasco).
Note: Instead of #include utils.h the same effect would probably be achieved by namespace GiNaC { extern const ex _ex0; } at the beginning of the file.
Please do so, and wrap that into _MSC_VER, and leave the code as is for other compilers. Thanks for your efforts. Best regards, Alexei