我在 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
但是如果我用 option 编译 boost runtime-link=static
,意味着静态链接 CRT,那么我可以成功地制作我的项目。
我的问题是:有人能解释一下为什么我的项目无法与 CRT 动态链接版本的 boost 链接,但成功与 CRT 静态链接版本的 boost,有什么区别?
顺便说一句:我的项目通过/MD
选项动态链接到 CRT。
编辑:
终于搞清楚了原因,我弄混了CMAKE_CXX_FLAGS_RELEASE
,CMAKE_CXX_FLAGS
前者有/MD
选项,后者没有。事实上 cmake 会将后者传递给编译器,所以我的程序实际上是静态链接的,如错误输出所示。
-DCMAKE_BUILD_TYPE=Release
解决方法:生成makefile时运行cmake with ,会自动添加CMAKE_CXX_FLAGS_RELEASE
intoCMAKE_CXX_FLAGS
的选项,然后程序会动态链接到CRT。
哦,一个愚蠢的问题。