[CMake] Re: Changing MD -> MT (+patch for free toolkit)

Mathieu Malaterre mathieu.malaterre at gmail.com
Sun Feb 17 08:17:50 EST 2008


Ok this was yet-another-weird-dll thingy, one cannot do:

class GDCM_EXPORT String : std::string { ... }

std::string is already exported (dllexport/dllimport) which was
causing the linker to complain...

As a side note, the free toolkit + a recent PSDK does have all the c
standard libs now. I also fixed two issues:
1. /D NDEBUG should be define for release build
2. Remove exception and rtti flags for the c compiler :)

Thanks
-Mathieu

On Feb 16, 2008 11:33 PM, Mathieu Malaterre <mathieu.malaterre at gmail.com> wrote:
> Hi there,
>
>   While trying to compile my project in shared libs I realized it was
> not compiling any more with the free C++ toolkit 2003. Looking at
> Windows-cl.cmake the only difference I can see is that each MD flags
> was changed to a MT.
>   So I decided to give it a try with the VCExpress/Nmake one, I choose
> Release and change MD into MT, and again my lib does not compile in
> shared lib mode ON. Is there something I am missing here ? Reading the
> definition of the flags MT I do not see why I should not be able to
> link to shared lib :
>
>   http://msdn2.microsoft.com/en-us/library/2kzt1wy3(VS.71).aspx
>
> As a side note pure-C executable seems to go fine, the real problem
> only occurs with C++ symbols duplicated.
>
> Ref:
> Linking CXX executable ..\..\..\..\bin\gdcmCommonTests.exe
> gdcmCommon.lib(gdcmCommon.dll) : error LNK2005: "public: int
> __thiscall std::basic_string<char,struct std::char_traits<char>,class
> std::allocator<char> >::compare(char const *)const " (?compare@?
> $basic_string at DU?$char_traits at D@std@@V?$allocator at D@2@@std@@QBEHPBD at Z)
> already defined in TestFilename.obj
> gdcmCommon.lib(gdcmCommon.dll) : error LNK2005: "public: class
> std::basic_string<char,struct std::char_traits<char>,class
> std::allocator<char> > & __thiscall std::basic_string<char,struct
> std::char_traits<char>,class std::allocator<char> >::operator
> +=(char)" (??Y?$basic_string at DU?$char_traits at D@std@@V?
> $allocator at D@2@@std@@QAEAAV01 at D@Z) already defined in TestFilename.obj
> gdcmCommon.lib(gdcmCommon.dll) : error LNK2005: "public: unsigned int
> __thiscall std::basic_string<char,struct std::char_traits<char>,class
> std::allocator<char> >::max_size(void)const " (?max_size@?
> $basic_string at DU?$char_traits at D@std@@V?$allocator at D@2@@std@@QBEIXZ)
> already defined in TestDirectory.obj
> gdcmCommon.lib(gdcmCommon.dll) : error LNK2005: "public: class
> std::basic_string<char,struct std::char_traits<char>,class
> std::allocator<char> > & __thiscall std::basic_string<char,struct
> std::char_traits<char>,class std::allocator<char> >::erase(unsigned
> int,unsigned int)" (?erase@?$basic_string at DU?$char_traits at D@std@@V?
> $allocator at D@2@@std@@QAEAAV12 at II@Z) already defined in
> TestByteSwap.obj
> TestString.obj : error LNK2019: unresolved external symbol "public:
> static unsigned int const std::basic_string<char,struct
> std::char_traits<char>,class std::allocator<char> >::npos" (?npos@?
> $basic_string at DU?$char_traits at D@std@@V?$allocator at D@2@@std@@2IB)
> referenced in function "class std::basic_istream<char,struct
> std::char_traits<char> > & __cdecl std::getline<char,struct
> std::char_traits<char>,class std::allocator<char> >(class
> std::basic_istream<char,struct std::char_traits<char> > &,class
> std::basic_string<char,struct std::char_traits<char>,class
> std::allocator<char> > &,char)" (??$getline at DU?$char_traits at D@std@@V?
> $allocator at D@2@@std@@YAAAV?$basic_istream at DU?
> $char_traits at D@std@@@0 at AAV10@AAV?$basic_string at DU?
> $char_traits at D@std@@V?$allocator at D@2@@0 at D@Z)
> ..\..\..\..\bin\gdcmCommonTests.exe : fatal error LNK1120: 1
> unresolved externals
>
> And the same issue with nmake/vs2005/MT:
>
>
> Microsoft (R) Program Maintenance Utility Version 8.00.50727.762
> Copyright (C) Microsoft Corporation. Tous droits r
> ..
> Linking CXX executable ..\bin\gdcmconv.exe
> libcpmt.lib(cerr.obj) : error LNK2005: "public: __thiscall
> std::basic_string<char,struct std::char_traits<char>,class
> std::allocator<char> >::basic_string<char,struct
> std::char_traits<char>,class std::allocator<char> >(void)"
> (??0?$basic_string at DU?$char_traits at D@std@@V?$allocator at D@2@@std@@QAE at XZ)
> déjà défini(e) dans gdcmMSFF.lib(gdcmMSFF.dll)
> libcpmt.lib(cerr.obj) : error LNK2005: "public: __thiscall
> std::basic_string<char,struct std::char_traits<char>,class
> std::allocator<char> >::~basic_string<char,struct
> std::char_traits<char>,class std::allocator<char> >(void)"
> (??1?$basic_string at DU?$char_traits at D@std@@V?$allocator at D@2@@std@@QAE at XZ)
> déjà défini(e) dans gdcmMSFF.lib(gdcmMSFF.dll)
> libcpmt.lib(cerr.obj) : error LNK2005: "public: __thiscall
> std::basic_string<char,struct std::char_traits<char>,class
> std::allocator<char> >::basic_string<char,struct
> std::char_traits<char>,class std::allocator<char> >(class
> std::basic_string<char,struct std::char_traits<char>,class
> std::allocator<char> > const &)"
> (??0?$basic_string at DU?$char_traits at D@std@@V?$allocator at D@2@@std@@QAE at ABV01@@Z)
> déjà défini(e) dans gdcmMSFF.lib(gdcmMSFF.dll)
> libcpmt.lib(cerr.obj) : error LNK2005: "public: __thiscall
> std::basic_string<char,struct std::char_traits<char>,class
> std::allocator<char> >::basic_string<char,struct
> std::char_traits<char>,class std::allocator<char> >(char const *)"
> (??0?$basic_string at DU?$char_traits at D@std@@V?$allocator at D@2@@std@@QAE at PBD@Z)
> déjà défini(e) dans gdcmMSFF.lib(gdcmMSFF.dll)
> libcpmt.lib(locale0.obj) : error LNK2005: "public: __thiscall
> std::basic_string<char,struct std::char_traits<char>,class
> std::allocator<char> >::~basic_string<char,struct
> std::char_traits<char>,class std::allocator<char> >(void)"
> (??1?$basic_string at DU?$char_traits at D@std@@V?$allocator at D@2@@std@@QAE at XZ)
> déjà défini(e) dans gdcmMSFF.lib(gdcmMSFF.dll)
> libcpmt.lib(locale0.obj) : error LNK2005: "public: __thiscall
> std::basic_string<char,struct std::char_traits<char>,class
> std::allocator<char> >::basic_string<char,struct
> std::char_traits<char>,class std::allocator<char> >(char const *)"
> (??0?$basic_string at DU?$char_traits at D@std@@V?$allocator at D@2@@std@@QAE at PBD@Z)
> déjà défini(e) dans gdcmMSFF.lib(gdcmMSFF.dll)
> libcpmt.lib(locale0.obj) : error LNK2005: "public: class
> std::basic_string<char,struct std::char_traits<char>,class
> std::allocator<char> > & __thiscall std::basic_string<char,struct
> std::char_traits<char>,class std::allocator<char> >::operator=(char
> const *)" (??4?$basic_string at DU?$char_traits at D@std@@V?$allocator at D@2@@std@@QAEAAV01 at PBD@Z)
> déjà défini(e) dans gdcmMSFF.lib(gdcmMSFF.dll)
> libcpmt.lib(string.obj) : error LNK2005: "public: __thiscall
> std::basic_string<char,struct std::char_traits<char>,class
> std::allocator<char> >::basic_string<char,struct
> std::char_traits<char>,class std::allocator<char> >(class
> std::basic_string<char,struct std::char_traits<char>,class
> std::allocator<char> > const &)"
> (??0?$basic_string at DU?$char_traits at D@std@@V?$allocator at D@2@@std@@QAE at ABV01@@Z)
> déjà défini(e) dans gdcmMSFF.lib(gdcmMSFF.dll)
> libcpmt.lib(string.obj) : error LNK2005: "public: __thiscall
> std::basic_string<char,struct std::char_traits<char>,class
> std::allocator<char> >::~basic_string<char,struct
> std::char_traits<char>,class std::allocator<char> >(void)"
> (??1?$basic_string at DU?$char_traits at D@std@@V?$allocator at D@2@@std@@QAE at XZ)
> déjà défini(e) dans gdcmMSFF.lib(gdcmMSFF.dll)
> libcpmt.lib(string.obj) : error LNK2005: "public: __thiscall
> std::basic_string<char,struct std::char_traits<char>,class
> std::allocator<char> >::basic_string<char,struct
> std::char_traits<char>,class std::allocator<char> >(char const *)"
> (??0?$basic_string at DU?$char_traits at D@std@@V?$allocator at D@2@@std@@QAE at PBD@Z)
> déjà défini(e) dans gdcmMSFF.lib(gdcmMSFF.dll)
> ..\bin\gdcmconv.exe : fatal error LNK1169: un ou plusieurs symboles
> définis à différentes reprises ont été rencontrés
> NMAKE : fatal error U1077: 'C:\PROGRA~1\MID05A~1\VC\bin\cl.exe' : code
> retour '0x2'
> Stop.
> NMAKE : fatal error U1077: '"c:\Program Files\Microsoft Visual Studio
> 8\VC\BIN\nmake.exe"' : code retour '0x2'
> Stop.
> NMAKE : fatal error U1077: '"c:\Program Files\Microsoft Visual Studio
> 8\VC\BIN\nmake.exe"' : code retour '0x2'
> Stop.
>
> Thanks !
> --
> Mathieu
>



-- 
Mathieu
-------------- next part --------------
A non-text attachment was scrubbed...
Name: free.patch
Type: application/octet-stream
Size: 2482 bytes
Desc: not available
Url : http://public.kitware.com/pipermail/cmake/attachments/20080217/963e739e/free.obj


More information about the CMake mailing list