总而言之,我想要的是避免在几个.dll中重复的.lib文件,因为生成的.dll将在.exe文件中一起使用,这会使重复的.lib文件中的全局状态重复。
具体问题:
我有一个包含3个库和一个.exe:
的项目依赖关系如下:
我有一个.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}}。无论如何要做到这一点?答案 0 :(得分:1)
来自链接静态库的.dll中的符号重复是静态库应该做的事情。如果静态库libIndependent
是第三方代码,那么libIndependent
的开发人员可能有一些理由选择静态库而不是动态库。
如果您在libIndependent
和libDependentA
使用libDependentB
中的符号而您没有libIndependent
的源代码,那么简短的回答是您无法直接执行此操作。静态库通常使用不同的标志/定义集来构建,而不是共享库(最明显的是导出符号dllexport
/ dllimport
,如您所述)。您可以libIndependent
从libDependentA
导出一些libDependentA
个符号。但通常只有dll中使用的符号出现在库中(libIndependentWrapper.dll
),您可能会遇到各种其他问题。
但是,您可以创建共享库包装器libIndependent
,在其中为所需的dllexport
的每个函数创建包装函数。包装器函数将包含dllimport
/ {{1}}的新标头。