3

我在 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_RELEASECMAKE_CXX_FLAGS前者有/MD选项,后者没有。事实上 cmake 会将后者传递给编译器,所以我的程序实际上是静态链接的,如错误输出所示。

-DCMAKE_BUILD_TYPE=Release解决方法:生成makefile时运行cmake with ,会自动添加CMAKE_CXX_FLAGS_RELEASEintoCMAKE_CXX_FLAGS的选项,然后程序会动态链接到CRT。

哦,一个愚蠢的问题。

4

1 回答 1

1

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

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

-DCMAKE_BUILD_TYPE=Release解决方法:生成makefile时运行cmake with ,会自动添加CMAKE_CXX_FLAGS_RELEASEintoCMAKE_CXX_FLAGS的选项,然后程序会动态链接到CRT。

于 2014-01-08T14:38:32.850 回答