Cmake,.lib,dll并避免在二进制文件中使用多个.lib副本

时间:2014-04-04 04:20:17

标签: c++ visual-studio-2010 dll cmake

总而言之,我想要的是避免在几个.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取决于libIndependent.lib,并从libDependentB.dll移除libIndependent.lib。我怎么能在cmake中做到这一点?这里的问题似乎是cmake传递到所有其他地方target_link_libraries(libDependentA...,包括.exe,如果它出现在LINK_PRIVATE中。如果我添加libIndependent.lib,那么我无法在cmake中设置我想要的配置,因为我必须再次将libDependentB.dll链接到{{1}}。无论如何要做到这一点?

1 个答案:

答案 0 :(得分:1)

来自链接静态库的.dll中的符号重复是静态库应该做的事情。如果静态库libIndependent是第三方代码,那么libIndependent的开发人员可能有一些理由选择静态库而不是动态库。

如果您在libIndependentlibDependentA使用libDependentB中的符号而您没有libIndependent的源代码,那么简短的回答是您无法直接执行此操作。静态库通常使用不同的标志/定义集来构建,而不是共享库(最明显的是导出符号dllexport / dllimport,如您所述)。您可以libIndependentlibDependentA导出一些libDependentA个符号。但通常只有dll中使用的符号出现在库中(libIndependentWrapper.dll),您可能会遇到各种其他问题。

但是,您可以创建共享库包装器libIndependent,在其中为所需的dllexport的每个函数创建包装函数。包装器函数将包含dllimport / {{1}}的新标头。