c++ - 如何在动态库(/MD)项目中使用静态库(/MT)?

标签 c++ windows cmake mt

我们的项目结构如下。

1) MainApp,它使用boost动态加载dll,所有dll项目/模块都是用/MD构建的。

2) 这些 dll 所需的任何其他项目都构建为静态 (.lib) 或动态 (.dll) 库。当这些依赖库是动态的时没有问题,因为我可以使用相同的 MD。但是,如果它们是静态的,我必须使用 MD 而不是默认的 MT 来构建它们,否则它无法加载到这些 dll 中。

这一直有效,直到我尝试编译 google cloud sdk c++。

这里是问题所在:Google cloud c++ sdk 有许多随 google git 而来的依赖项,但 Google 只包含(或构建默认)静态(/MT)版本。而且他们甚至不提供更改为 MD 的选项。我可以使用 cmake 命令 set(CMAKE_CXX_FLAGS_RELEASE "/MD") 将 google cloud lib 从/MT 更改为/MD,但这不会构建,因为它的依赖项是/MT。

简化情况:

MainApp.exe 动态加载 -> Function.dll (/MD),然后 Function.dll 静态链接 Google_cloud.lib(.lib 但带有/MD),然后 Google_cloud.lib 静态链接其依赖项(.lib 带有/MT , 不能改成/MD)

所以我想唯一的选择是使用/MD 手动自定义构建 google cloud 的静态依赖项,然后使用/MD 将 google cloud 构建为静态,然后由我的 function.dll 作为静态加载。

有什么建议吗?

最佳答案

您可以更改 BUILD_SHARED_LIBS 标志,这将导致默认库类型成为共享库。

另一种方法是简单地将正确的参数传递给 add_library 命令:

add_library(lib1 SHARED a.cpp b.cpp)
add_library(lib2 STATIC a.cpp b.cpp)
add_library(lib3 a.cpp b.cpp) # use the BUILD_SHARED_LIBS value

关于c++ - 如何在动态库(/MD)项目中使用静态库(/MT)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57044932/

相关文章:

C++:用于循环打印地址而不是值的数组

c++ - "using namespace"子句在什么范围内有效?

visual-studio - CMake - 访问多配置生成器的配置参数

c++ - 为什么类的字段是自动对象?

windows - Windows 版发送邮件

使用 FindFirstFile/FindNextFile 删除文件夹中所有文件的 C++ 代码

python - 在另一个程序/脚本中实时使用 Sysinternals Process Monitor 的输出

c++ - 构建支持 OpenCL 的 OpenCV

c++ - OpenAL:如何添加 ALUT

c++ - 检查所有使用的 OpenGL 扩展