我目前正在尝试链接到 boost lib
libboost_regex-vc90-mt-gd-1_53.lib
这是从此命令行创建的
b2^
--stagedir=%BOOST_OUTPUT_DIR%^
--build-dir=%BOOST_BUILD_DIR%^
toolset=msvc-9.0^
link=static^
variant=release,debug^
threading=multi^
runtime-link=shared^
stage
但我收到以下链接错误(其中之一):
msvcprtd.lib(MSVCP90D.dll) : 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@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAE@XZ) déjà défini(e) dans TrailerContest.Reflection.obj
我增加了链接器的详细程度以了解有关此错误的更多信息,这就是我得到的:
Searching c:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\lib\msvcprtd.lib :
1> "__declspec(dllimport) 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)" (__imp_??1?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAE@XZ) found
1> Referenced in libboost_date_time-vc90-mt-gd-1_53.lib(greg_month.obj)
1> Referenced in libboost_random-vc90-mt-gd-1_53.lib(random_device.obj)
1> Referenced in libboost_thread-vc90-mt-gd-1_53.lib(thread.obj)
1> Referenced in libboost_regex-vc90-mt-gd-1_53.lib(instances.obj)
1> Referenced in libboost_regex-vc90-mt-gd-1_53.lib(regex.obj)
1> Referenced in libboost_regex-vc90-mt-gd-1_53.lib(w32_regex_traits.obj)
1> Referenced in libboost_system-vc90-mt-gd-1_53.lib(error_code.obj)
1> Loaded msvcprtd.lib(MSVCP90D.dll)
1>msvcprtd.lib(MSVCP90D.dll) : 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@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAE@XZ) already defined in TrailerContest.Reflection.obj
似乎所有 boost 库都尝试从 MSVCP90D.dll 导入 std::string 函数
__imp_??1?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAE@XZ
而我自己的程序似乎嵌入了 std::string 代码,因此尝试在内部进行链接。
??1?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAE@XZ
我想我在这里有两个选择,要么我让 boost 嵌入 std::string 代码,所以 boost 和我的程序在两个 objs 中都有相同的声明,并且可以实现链接。我的程序必须像 boost 一样从 MSVCP90D.dll 导入 std::string 代码。
问题是我不知道如何在不导入 std::string 代码的情况下要求 boost 进行编译。而且我不知道如何强制我的程序从 MSVCP90D.dll 导入 std::string,有人知道吗?
我必须说我的程序显然是用 /MDd 选项编译的。Boost 也应该使用此选项编译,行runtime-link=shared