动态链接错误与静态链接的boost库

时间:2013-09-09 09:36:42

标签: c++ boost cmake static-linking dynamic-linking

我在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_RELEASECMAKE_CXX_FLAGS混为一谈,前者有/MD选项,但后者没有。-DCMAKE_BUILD_TYPE=Release。事实上,cmake会将后者传递给编译器,因此我的程序实际上是在错误输出显示时静态链接的。

解决方案:在生成makefile时使用CMAKE_CXX_FLAGS_RELEASE运行cmake,这会自动将CMAKE_CXX_FLAGS的选项添加到{{1}},然后程序将动态链接到CRT。

哦,这是一个愚蠢的问题。

1 个答案:

答案 0 :(得分:1)

抱歉,这个问题是我自己提出的,最后我找出了原因,并将解决方案粘贴在问题的编辑部分。但是@TobiMcNamobi建议给这个问题一个答案,即使是我自己也要问。所以我在这里粘贴答案:

我将CMAKE_CXX_FLAGS_RELEASECMAKE_CXX_FLAGS混为一谈,前者有/MD选项,但后者没有。-DCMAKE_BUILD_TYPE=Release。事实上,cmake会将后者传递给编译器,因此我的程序实际上是在错误输出显示时静态链接的。

解决方案:在生成makefile时使用CMAKE_CXX_FLAGS_RELEASE运行cmake,这会自动将CMAKE_CXX_FLAGS的选项添加到{{1}},然后程序将动态链接到CRT。