CMake "安装" 目标及其 SO 依赖项
CMake `INSTALL` for targets and its SO dependencies
我的目标与使用带有PUBLIC
关键字的TARGET_LINK_LIBRARIES
的多个库链接,INSTALL
命令看起来像INSTALL(TARGETS foo DESTINATION ${CMAKE_INSTALL_PREFIX}/bin)
。我想以某种方式强制 cmake 包含我链接的所有(最好不包括系统库(库(仅限 SO(以包含在安装过程中。我尝试过 EXPORT 关键字,但看起来它只影响我在项目中构建的库,并用与库相同的EXPORT
标记foo
库。
可能吗?
EDIT001:可能影响答案的其他信息。 我正在使用 vcpkg 来管理第三方。所以TARGET_LINK_LIBRARIES
看起来像
TARGET_LINK_LIBRARIES(foo PUBLIC
GTest::GTest
GTest::Main
${GOOGLE_MOCK}
event
${THRIFT_LIBRARIES}
${Boost_LIBRARIES}
lzo2
sqlite3
${ZeroMQ_LIBRARY}
gRPC::grpc
gRPC::grpc++
xml2
stdc++fs
bfd
-l:libisal.so.2
sgutils2
pthread
uuid
rt
)
所以,本质上我想要实现的是利用所有这些由vcpkg
宏的库,如${THRIFT_LIBRARIES}, ${Boost_LIBRARIES} and gRPC::grpc
等
从 cmake 3.21 开始,您现在可以执行以下操作:
install(IMPORTED_RUNTIME_ARTIFACTS gRPC::grpc)
install(IMPORTED_RUNTIME_ARTIFACTS ${Boost_LIBRARIES})
等。
请参阅新的安装命令。
CMake 本身不允许自动安装依赖项。这将是一项相当艰巨的任务,因为它必须考虑很多极端情况。
想想传递依赖(我不知道这是否是正确的词(,比如:你的libA
取决于libB
,这取决于libC
。CMake 应该如何从只列出libB
的 CMakeList 中获取此信息?
或者:您认为系统库是什么?所有不在PATH
的东西?如何知道客户端计算机上在系统范围内安装了哪些库?
你看,有一些非常棘手的事情需要考虑。
以下是您拥有的一些可能性:
- 要求用户安装依赖项。
- 将库静态链接到二进制文件。
- 使用
install(FILES files... DESTINATION <dir>)
复制库文件。也许您的依赖项管理器可以帮助创建文件列表。 - 编写一个脚本,为Windows上基于Qt的应用程序执行类似于
windeployqt
的操作:分析二进制文件(例如使用ldd myApp
(并自动复制所需的依赖项。
相关文章:
- 如何使用ndk-build.cmd构建Android.so文件
- 在C++代码中包含opencv时,使用ctypes创建.so文件
- 应用程序崩溃并显示"symbol _ZdlPvm, version Qt_5 not defined in file libQt5Core.so.5 with link time reference"
- CLANG格式在缺少libtinfo.so.5库中不起作用
- C++ 运行时链接器错误 (liblog4cpp.so.5) Eclipse
- 使 ld 忽略来自 /etc/ld.so.conf 的目录
- N-API include an .so or dll
- 加载共享库时C++错误:libopencv_ximgproc.so.4.4
- 如何从构建 libgpio.so 的生成文件构建libgpio.a
- 用于构建 cuda .so 文件(共享库)的生成文件
- 无法从 SO 文件调用 SO 文件的函数 - C++生成文件
- 共享库 (.so) 没有扩展名的 Linux 可执行文件之间的区别?
- 在jupyter notebook和google colab中使用.so
- 如何在 C++ 的 .so 文件中包含库
- JNI,使用两个 .so 文件时出错,其中一个文件需要另一个文件
- OpenVINO - 推理库插件 libMKLDNNPlugin.so 无法解析依赖关系
- 如何使用QtCreator将应用程序与"libqsqlpsql.so"链接?
- 添加符号 libgtest.so 错误:命令行中缺少 DSO
- 为什么C++可执行文件在与较新的libstdc++.so链接时运行得更快?
- libstdc++.so.6:添加符号时出错:命令行中缺少 DSO