CMake -如何导出具有私有依赖项的库[重复]

rvpgvaaj  于 2023-06-29  发布在  其他
关注(0)|答案(1)|浏览(143)

此问题已在此处有答案

install EXPORT problem for library with dependencies(2个答案)
15小时前关门了。
我正在尝试从CMake项目导出库。在内部,我将这个库分解为多个子目标。我现在想只导出完整的公共库,而不需要我的私有库二进制文件。以下内容不起作用。

cmake_minimum_required(VERSION 3.2)

project(export-mwe)

add_library(priv priv.cpp)

add_library(exp-lib exp-lib.cpp)
target_link_libraries(exp-lib PRIVATE priv)

install(TARGETS exp-lib EXPORT export-mwe DESTINATION lib)

install(EXPORT export-mwe DESTINATION .)

当我尝试生成这个项目时,我得到一个错误。

CMake Error: install(EXPORT "export-mwe" ...) includes target "exp-lib" which requires target "priv" that is not in the export set.

在这个例子中,我如何只导出exp-lib,而不必导出priv

eqzww0vc

eqzww0vc1#

exp-libstatic(这是Linux上的默认设置),所以它没有与priv“物理”链接:静态库的创建根本不调用链接器。
当应用于静态库时,CMake以特定的方式解释target_link_libraries:与priv库文件的实际链接被移动到与exp-lib链接的every目标。
也就是说,更进一步

target_link_libraries(shared-lib exp-lib)

将被转换到链接器的命令行

ld -o shared-lib.so <...> exp-lib.a deps.a

导出静态库时,CMake会暴露相同的行为:任何通过target_link_libraries链接到IMPORTED目标exp-lib的目标都会自动链接到deps.a。为了实现这样的行为,CMake需要知道deps.a安装在哪里。
虽然deps.a的安装位置可以从install(TARGETS deps)命令中获得,但CMake仍然需要导出安装:install(TARGETS deps EXPORT export-mwe) .

相关问题