【发布时间】:2013-09-09 09:36:42
【问题描述】:
我在 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的make过程失败,链接错误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,那么我可以成功地制作我的项目。
我的问题是:有人能解释一下为什么我的项目无法链接到 CRT 动态链接版本的 boost,但成功链接了 CRT 静态链接版本的 boost,有什么区别?
顺便说一句:我的项目使用 /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。
哦,一个愚蠢的问题。
【问题讨论】:
-
错误信息表明正在编译
http_proxy_server.cpp以使用库的MT_StaticRelease。这可能是原因吗?该翻译单元是如何编译的? -
@greatwolf 编译?也许你的意思是链接?我的项目通过
/MD选项动态链接到 CRT,但静态链接到 boost 库。 -
你试过加set(Boost_USE_STATIC_RUNTIME OFF)吗?
-
@Daarx 嗯,终于找到原因了,是
CMAKE_CXX_FLAGS设置不当,请看本题edit部分。
标签: c++ boost cmake static-linking dynamic-linking