我的目标使用TARGET_LINK_LIBRARIES
和PUBLIC
关键字与多个库链接,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
等
答案 0 :(得分:2)
从 cmake 3.21 开始,您现在可以使用:
install(IMPORTED_RUNTIME_ARTIFACTS gRPC::grpc)
install(IMPORTED_RUNTIME_ARTIFACTS ${Boost_LIBRARIES})
等
答案 1 :(得分:1)
CMake本身不允许自动安装依赖项。这将是一项相当艰巨的任务,因为它将不得不考虑很多极端情况。
只需考虑传递依赖项(我不知道这是否是正确的词),例如:您的libA
依赖于libB
,而依赖于libC
。 CMake应该如何从仅列出libB
的CMakeList中获得此信息?
或者:您认为系统库是什么? PATH
中没有的所有内容?您如何知道在客户端计算机上系统范围内安装了哪些库?
您知道,有一些非常棘手的事情需要考虑。
以下是您的一些可能性:
install(FILES files... DESTINATION <dir>)
复制库文件。也许您的依赖项管理器可以帮助创建文件列表。windeployqt
的脚本:分析二进制文件(例如,使用ldd myApp
)并自动复制所需的依赖项。