静态链接升压库的动态链接错误

Dynamic linking error with statically linked boost library

本文关键字:链接 动态 错误 静态      更新时间:2023-10-16

我在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,那么我可以成功制作我的项目。

我的

问题是:有人可以解释为什么我的项目未能与 CRT 动态链接版本的 boost 链接,但与 CRT 静态链接版本的提升成功,有什么区别?

顺便说一句:我的项目通过/MD选项动态链接到 CRT。


编辑:

终于想通了原因,我把CMAKE_CXX_FLAGS_RELEASECMAKE_CXX_FLAGS混为一谈,前者有/MD选择,但后者没有。事实上,cmake 会将后者传递给编译器,所以我的程序实际上是静态链接的,如错误输出所示。

解决方案:生成makefile时-DCMAKE_BUILD_TYPE=Release运行cmake,这将自动将CMAKE_CXX_FLAGS_RELEASE选项添加到CMAKE_CXX_FLAGS中,然后程序将动态链接到CRT。

哦,一个愚蠢的问题。

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

CMAKE_CXX_FLAGS_RELEASECMAKE_CXX_FLAGS混为一谈,前者有/MD选择,但后者没有。事实上,cmake 会将后者传递给编译器,所以我的程序实际上是静态链接的,如错误输出所示。

解决方案:在生成makefile时用-DCMAKE_BUILD_TYPE=Release运行cmake,这将自动将CMAKE_CXX_FLAGS_RELEASE选项添加到CMAKE_CXX_FLAGS中,然后程序将动态链接到CRT。