我在Windows(MSVC 2012)上,使用Boost v1.54,我使用以下参数编译 Boost.Log (我的小项目取决于它):
b2.exe link=static variant=release runtime-link=shared --with-log stage
因此,日志模块已编译并动态链接到C运行时库。
然后我的小项目使用 CMake 进行管理,我添加选项以静态链接提升:
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,有什么区别?
BTW:我的项目通过/MD
选项动态链接到CRT。
修改
最后我找出原因,我将CMAKE_CXX_FLAGS_RELEASE
与CMAKE_CXX_FLAGS
混为一谈,前者有/MD
选项,但后者没有。-DCMAKE_BUILD_TYPE=Release
。事实上,cmake会将后者传递给编译器,因此我的程序实际上是在错误输出显示时静态链接的。
解决方案:在生成makefile时使用CMAKE_CXX_FLAGS_RELEASE
运行cmake,这会自动将CMAKE_CXX_FLAGS
的选项添加到{{1}},然后程序将动态链接到CRT。
哦,这是一个愚蠢的问题。
答案 0 :(得分:1)
抱歉,这个问题是我自己提出的,最后我找出了原因,并将解决方案粘贴在问题的编辑部分。但是@TobiMcNamobi建议给这个问题一个答案,即使是我自己也要问。所以我在这里粘贴答案:
我将CMAKE_CXX_FLAGS_RELEASE
与CMAKE_CXX_FLAGS
混为一谈,前者有/MD
选项,但后者没有。-DCMAKE_BUILD_TYPE=Release
。事实上,cmake会将后者传递给编译器,因此我的程序实际上是在错误输出显示时静态链接的。
解决方案:在生成makefile时使用CMAKE_CXX_FLAGS_RELEASE
运行cmake,这会自动将CMAKE_CXX_FLAGS
的选项添加到{{1}},然后程序将动态链接到CRT。