[CMake] Changing MD -> MT

Mathieu Malaterre mathieu.malaterre at gmail.com
Sat Feb 16 17:33:29 EST 2008


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


More information about the CMake mailing list