【问题标题】:Dynamic linking error with statically linked boost library静态链接的 boost 库的动态链接错误
【发布时间】: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


【解决方案1】:

不好意思,这个问题是我自己问的,终于搞清楚了原因,把解决方法贴在问题的编辑部分。但是@TobiMcNamobi 建议给这个问题一个答案,即使它是我自己提出的。所以我把答案贴在这里:

我将CMAKE_CXX_FLAGS_RELEASE 与CMAKE_CXX_FLAGS 混淆了,前者有一个/MD 选项,但后者没有。实际上cmake会将后者传递给编译器,所以我的程序实际上是静态链接的,如错误输出所示。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多