【问题标题】:How to use a static library (/MT) in a dynamic lib (/MD) project?如何在动态库 (/MD) 项目中使用静态库 (/MT)?
【发布时间】:2019-11-24 11:06:01
【问题描述】:

我们的项目结构是这样的。

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") 将谷歌云库从 /MT 更改为 /MD,但这不会构建,因为它的依赖项是 /MT。

简化情况:

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

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

有什么建议吗?

【问题讨论】:

  • 我的建议是对程序的所有部分使用相同的运行时(除了需要调试运行时的调试配置)。

标签: c++ windows cmake mt


【解决方案1】:

您可以更改 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-13
    • 1970-01-01
    相关资源
    最近更新 更多