静态链接升压库的动态链接错误
Dynamic linking error with statically linked boost library
我在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_RELEASE
和CMAKE_CXX_FLAGS
混为一谈,前者有/MD
选择,但后者没有。事实上,cmake 会将后者传递给编译器,所以我的程序实际上是静态链接的,如错误输出所示。
解决方案:生成makefile时-DCMAKE_BUILD_TYPE=Release
运行cmake,这将自动将CMAKE_CXX_FLAGS_RELEASE
选项添加到CMAKE_CXX_FLAGS
中,然后程序将动态链接到CRT。
哦,一个愚蠢的问题。
抱歉,这个问题是我自己问的,最后我想通了原因,我将解决方案粘贴在问题的"编辑"部分。但是@TobiMcNamobi建议给这个问题一个答案,即使是我自己问的。所以我把答案贴在这里:
我CMAKE_CXX_FLAGS_RELEASE
和CMAKE_CXX_FLAGS
混为一谈,前者有/MD
选择,但后者没有。事实上,cmake 会将后者传递给编译器,所以我的程序实际上是静态链接的,如错误输出所示。
解决方案:在生成makefile时用-DCMAKE_BUILD_TYPE=Release
运行cmake,这将自动将CMAKE_CXX_FLAGS_RELEASE
选项添加到CMAKE_CXX_FLAGS
中,然后程序将动态链接到CRT。
- g++用户定义的动态链接库上的全局new和delete运算符
- 如何使用C++导出制作动态链接库
- 链接 c++ 动态库一直失败
- 如果包含映射的静态库与可执行文件和动态库链接,静态映射(变量)是否会被多次释放?
- 使用动态链接加载程序 <dlfcn.h> 而不是直接函数调用的目的是什么?
- 动态链接库中C++回调函数
- 如果同时存在共享库和动态库,则链接器将首选哪个库?
- 我的动态链接队列在同一输出流中调用时不正确地输出三个返回函数
- 如何动态链接 grpc 库 c++?
- 如何在Windows上链接动态构建的cmake文件
- 当我链接动态库而不是静态库时,CMake 有效
- 在MacOS上使用Bazel链接动态库
- 链接动态库
- 链接动态和静态库 RCPP
- Windows C++Eclipse MinGW链接动态和静态库
- 如何根据另一个动态库链接动态库
- 从另一个 dll 链接动态 dll 会导致错误
- 链接动态库时出错.所以使用Lua
- G++:链接动态(dylib)库
- Qt - 帮助链接动态库