我使用 Windows(MSVC 2012) 和 Boost v1.54,在编译 Boost.Log (我的小项目依赖它)时,使用了以下参数:
b2.exe link=static variant=release runtime-link=shared --with-log stage
所以,日志模块被编译并动态链接到C运行时库。
然后,我的小项目使用CMake进行管理,并添加选项以静态链接boost:
set(Boost_USE_STATIC_LIBS ON)
但是生成nmake makefile的过程失败了,出现了链接错误2038:
libboost_log-vc110-mt-1_54.lib(attribute_set.obj):-1: error: LNK2038:
mismatch detected for 'RuntimeLibrary': value 'MD_DynamicRelease' doesn't
match value 'MT_StaticRelease' in http_proxy_server.cpp.obj
如果我使用选项
runtime-link=static
编译boost,表示静态链接CRT,那么我就可以成功地制作我的项目。我的问题是:有人能解释一下为什么我的项目无法与动态链接版本的boost链接到CRT,但是可以使用静态链接版本的boost链接到CRT吗?有什么区别?
顺便说一句:我的项目使用
/MD
选项动态链接到CRT。编辑:
最终我找出了原因,我混淆了
CMAKE_CXX_FLAGS_RELEASE
和CMAKE_CXX_FLAGS
,前者有一个/MD
选项,但后者没有。事实上,cmake将后者传递给编译器,所以我的程序实际上是静态链接的,因为错误输出显示了这一点。解决方案:在生成makefile时使用
-DCMAKE_BUILD_TYPE=Release
选项运行cmake,这将自动将CMAKE_CXX_FLAGS_RELEASE
的选项添加到CMAKE_CXX_FLAGS
中,然后程序将链接到CRT动态库。哦,一个愚蠢的问题。
CMAKE_CXX_FLAGS
的设置不当,请参见此问题的 编辑 部分。 - Kelvin Hu