正确的CMake安装依赖内部静态库的共享库的方法

时间:2019-08-20 09:49:58

标签: c++ cmake

我的CMakeLists具有以下结构:

...
add_subdirectory(staticLibrary1)
add_subdirectory(staticLibrary2)
add_subdirectory(staticLibrary3)

add_library(sharedLibrary ...)
target_link_libraries(sharedLibrary staticLibrary1 staticLibrary2 staticLibrary3)
...
    例如,
  • staticLibraryN 可能取决于系统库。
  • staticLibraryN 可以提供公共头,对于 sharedLibrary 也必须是公共头。
  • staticLibraryN 源无法复制到 sharedLibrary

问::如何正确安装 sharedLibrary ,以便可以在find_package()上找到它并对其进行编译?

所需的结果是安装工作就像所有静态库代码都已复制到共享库一样。

我知道如何编写目标导出,创建config.cmake文件以及如何安装标头。问题与依赖项转换有关。


我可以想到2种不太好的方法。

1。(我现在的操作方式)

我安装了静态库的目标,然后在我的find_dependency()文件中为每个目标添加了-config.cmake

它的一个缺点:静态库与 sharedLibrary 一起安装,我并不需要。如果我尝试跳过它们,它将开始抱怨缺少静态库。

(请注意,如果我将它们更改为共享库,则一切工作都将近乎完美。)

2。(我没有尝试过,但也应该可以使用)

使用生成器表达式,如下所示:

target_link_libraries(sharedLibrary $<BUILD_INTERFACE:staticLibrary1> $<BUILD_INTERFACE:staticLibrary2> $<BUILD_INTERFACE:staticLibrary3>)

但这有一个缺点:我无法在find_package()调用期间自动收集其依赖项。

我可能第二次需要将所有依赖项写为$<INSTALL_INTERFACE>。也许比第一种方法更不方便。

0 个答案:

没有答案