CMake `INSTALL` 用于目标及其 SO 依赖项
CMake `INSTALL` for targets and its SO dependencies
我的目标 link 使用带有 PUBLIC
关键字的 TARGET_LINK_LIBRARIES
和几个库编辑,INSTALL
命令看起来像 INSTALL(TARGETS foo DESTINATION ${CMAKE_INSTALL_PREFIX}/bin)
。我想以某种方式强制 cmake 将所有(最好不包括系统库)库(仅限 SO)包含在安装过程中 link。我试过 EXPORT 关键字,但看起来它只影响我在我的项目中构建的库,并用与 foo
库相同的 EXPORT
标记。
可能吗?
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 本身不允许自动安装依赖项。这将是一项相当艰巨的任务,因为它必须考虑很多极端情况。
想想传递依赖(我不知道这个词是否正确),比如:你的 libA
依赖于 libB
,后者依赖于 libC
。 CMake 应如何从仅列出 libB
的 CMakeLists 中获取此信息?
或者:您认为系统库是什么? PATH
中没有的所有内容?您如何知道客户端计算机上系统范围内安装了哪些库?
你看,有一些非常棘手的事情需要考虑。
以下是您的一些可能性:
- 请您的用户安装依赖项。
- 静态 link 库到您的二进制文件中。
- 使用
install(FILES files... DESTINATION <dir>)
复制库文件。也许您的依赖项管理器可以帮助创建文件列表。
- 为 Windows 上基于 Qt 的应用程序编写类似
windeployqt
的脚本:分析二进制文件(例如使用 ldd myApp
)并自动复制所需的依赖项。
从 cmake 3.21 开始,您现在可以使用:
install(IMPORTED_RUNTIME_ARTIFACTS gRPC::grpc)
install(IMPORTED_RUNTIME_ARTIFACTS ${Boost_LIBRARIES})
等等
我的目标 link 使用带有 PUBLIC
关键字的 TARGET_LINK_LIBRARIES
和几个库编辑,INSTALL
命令看起来像 INSTALL(TARGETS foo DESTINATION ${CMAKE_INSTALL_PREFIX}/bin)
。我想以某种方式强制 cmake 将所有(最好不包括系统库)库(仅限 SO)包含在安装过程中 link。我试过 EXPORT 关键字,但看起来它只影响我在我的项目中构建的库,并用与 foo
库相同的 EXPORT
标记。
可能吗?
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 本身不允许自动安装依赖项。这将是一项相当艰巨的任务,因为它必须考虑很多极端情况。
想想传递依赖(我不知道这个词是否正确),比如:你的 libA
依赖于 libB
,后者依赖于 libC
。 CMake 应如何从仅列出 libB
的 CMakeLists 中获取此信息?
或者:您认为系统库是什么? PATH
中没有的所有内容?您如何知道客户端计算机上系统范围内安装了哪些库?
你看,有一些非常棘手的事情需要考虑。
以下是您的一些可能性:
- 请您的用户安装依赖项。
- 静态 link 库到您的二进制文件中。
- 使用
install(FILES files... DESTINATION <dir>)
复制库文件。也许您的依赖项管理器可以帮助创建文件列表。 - 为 Windows 上基于 Qt 的应用程序编写类似
windeployqt
的脚本:分析二进制文件(例如使用ldd myApp
)并自动复制所需的依赖项。
从 cmake 3.21 开始,您现在可以使用:
install(IMPORTED_RUNTIME_ARTIFACTS gRPC::grpc)
install(IMPORTED_RUNTIME_ARTIFACTS ${Boost_LIBRARIES})
等等