gpt4 book ai didi

c++ - Cmake、.lib、dll 并避免在二进制文件中复制多个 .lib

转载 作者:行者123 更新时间:2023-11-28 06:58:33 31 4
gpt4 key购买 nike

总而言之,我想要的是避免在多个 .dll 中出现重复的 .lib 文件,因为生成的 .dll 将在一个 .exe 文件中一起使用,这会使 .lib 文件中的全局状态重复。

具体问题:

我有一个包含 3 个库和一个 .exe 的项目:

  • libDependentA.dll
  • libDependentB.dll
  • libIndependent.lib -- 静态库

依赖如下:

  • libDependentA.dll -- 依赖于 -> libIndependent.lib
  • libDependentB.dll -- 依赖 -> libIndependent.lib

我有一个 .exe。同时依赖于 libDependentA.dll 和 libDependentB.dll

这会将我的 .lib 复制到 .exe 中,这就是导致问题的原因。

解决方案?

  • 首选解决方案。不知道是否可能,谷歌搜索时没有信息。

libIndependent.lib 中创建一个 .dll。我怎样才能做到这一点?我无法通过 add_libary(newdllfromlib SHARED) 在 cmake 中从 .lib 文件创建 dll。它没有源文件依赖项,我尝试将 target_link_libraries 放入newdllfromlib。有没有不使用空源文件或其他技巧的简单方法?

  • 使 libDependentB.dll 仅依赖于 libDependentA.dll 并从 libDependentB.dll 中删除 libIndependent.lib .我怎样才能在 cmake 中做到这一点?这里的问题似乎是 cmake 可传递地传播到所有其他地方 libIndependent.lib,包括 .exe,如果它出现在 target_link_libraries(libDependentA... 中。如果我添加了 LINK_PRIVATE,然后,我无法在 cmake 中设置我想要的配置,因为我必须再次将 libIndependent.lib 链接到 libDependentB.dll. 无论如何要做?

最佳答案

从链接的静态库中复制 .dll 中的符号是静态库应该做的。如静态库libIndependent是第 3 方代码,然后是 libIndependent 的开发人员他们选择静态库而不是动态库可能有一些原因。

如果您使用来自 libIndependent 的符号在两个libDependentAlibDependentB而且您没有 libIndependent 的源代码,简短的回答是你不能直接这样做。静态库通常使用与共享库不同的标志/定义集构建(最明显的是导出符号 dllexport/dllimport 如您所述)。您可以导出一些 libIndependent来自 libDependentA 的符号通过 def file .但通常只有在 dll 中使用的符号才会出现在库中 (libDependentA),您可能会遇到各种其他问题。

但是您可以创建共享库包装器 libIndependentWrapper.dll ,您可以在其中为 libIndependent 中的每个函数创建一个包装函数你需要。包装函数将具有带有 dllexport 的新 header /dllimport .

关于c++ - Cmake、.lib、dll 并避免在二进制文件中复制多个 .lib,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22853497/

31 4 0
文章推荐: c++ - Wininet 给出链接器错误我正在使用 devc++
文章推荐: c++ - 函数不会接受用户输入,跳过 getline
文章推荐: html - 样式元素未显示