我有一个外部项目和一个导入的共享库.include目录和implib都可正常工作,但尝试安装共享库(dll)失败,并出现以下错误:
install TARGETS given target "my_shared_lib" which does not exist in this directory.
Run Code Online (Sandbox Code Playgroud)
这是重现的代码:
add_library(my_shared_lib SHARED IMPORTED GLOBAL)
set_property(TARGET my_shared_lib PROPERTY INTERFACE_INCLUDE_DIRECTORIES "${CMAKE_CURRENT_BINARY_DIR}/ExternalProjects/my_shared_lib")
set_property(TARGET my_shared_lib PROPERTY IMPORTED_LOCATION "${CMAKE_CURRENT_BINARY_DIR}/ExternalProjects/my_shared_lib/my_shared_lib.dll")
set_property(TARGET my_shared_lib PROPERTY IMPORTED_IMPLIB "${CMAKE_CURRENT_BINARY_DIR}/ExternalProjects/my_shared_lib/my_shared_lib.lib")
add_executable(main main.cpp)
add_dependencies(main my_shared_lib)
target_link_libraries(main PUBLIC my_shared_lib)
install(TARGETS main DESTINATION "${CMAKE_CURRENT_BINARY_DIR}/DIST")
install(TARGETS my_shared_lib DESTINATION "${CMAKE_CURRENT_BINARY_DIR}/DIST")
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?
编辑:现在我通过使用get_property拉出IMPORTED_LOCATION,然后使用INSTALL FILES并给出该属性的值来解决这个问题.它似乎有效,但是有更好的,更惯用的解决方案吗?
nyi*_*ang 14
在 CMake 3.21 中,有一个install(...)名为 的新子命令IMPORTED_RUNTIME_ARTIFACTS。
请参阅完整文档。
对于你的情况,你可以这样做:
install(IMPORTED_RUNTIME_ARTIFACTS my_shared_lib)
Run Code Online (Sandbox Code Playgroud)
Tsy*_*rev 13
CMake不允许将IMPORTED库安装为TARGETS.请install(FILES)改用.
这种行为至少有两个原因:
来自错误报告的CMake开发人员之一
导入的目标最初是为从某些外部软件包的现有安装导入而设计的,因此当时安装没有意义.
安装普通库时,CMake可以修改它以调整RPATH等属性.这样的修改是可能的,因为CMake 知道如何构建库.这是将库安装为TARGET的主要优点.
但对于IMPORTED库,CMake没有关于库编译过程的信息,也无法对其进行任何合理的修改.因此,CMake可能只按原样安装库文件:对简单而言没有优势install(FILES).
| 归档时间: |
|
| 查看次数: |
3940 次 |
| 最近记录: |