cmake - Cmake - 导出和导入库
问题描述
CMake 导出/导入库
我想以可移植的方式(windows 和 linux)在 cmake 中导出和导入库。我想用安装目标和导出命令正确、干净地完成它,但是它们非常神秘,而且文档 - 虽然完整 - 绝对没有提供任何上下文,也没有提供简单的示例来学习。目前,我有 libA 的 cmakelists :
cmake_minimum_required(VERSION 3.5)
project(libA VERSION 0.1.0 LANGUAGES C)
# Files
set(PUBLIC_HEADERS
includes/libA.h
)
set(SOURCE_FILES
sources/libA.c
)
# Shared library
add_library(libA SHARED
${SOURCE_FILES}
)
set_target_properties(libA PROPERTIES
PUBLIC_HEADER "${PUBLIC_HEADERS}"
)
# Include paths
target_include_directories(libA
PUBLIC
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/includes>
)
# Link
target_link_libraries(libA)
# Packaging
# Install target to export
set(CMAKE_INSTALL_PREFIX "$ENV{CMAKE_REPO}/libA")
install(TARGETS libA
EXPORT libA-export
LIBRARY DESTINATION "${CMAKE_INSTALL_PREFIX}/bin"
ARCHIVE DESTINATION "${CMAKE_INSTALL_PREFIX}/bin"
RUNTIME DESTINATION "${CMAKE_INSTALL_PREFIX}/bin"
PUBLIC_HEADER DESTINATION "${CMAKE_INSTALL_PREFIX}/include"
)
# Install export
install(EXPORT libA-export
FILE libATargets.cmake
CONFIGURATIONS Debug|Release
DESTINATION ${CMAKE_INSTALL_PREFIX}/cmake
)
# Install config file
install(FILES libAConfig.cmake
CONFIGURATIONS Debug|Release
DESTINATION ${CMAKE_INSTALL_PREFIX}/cmake
)
配置文件的内容是:
get_filename_component(libA_CMAKE_DIR "${CMAKE_CURRENT_LIST_FILE}" PATH)
include(CMakeFindDependencyMacro)
if(NOT TARGET libA)
include("${libA_CMAKE_DIR}/libATargets.cmake")
endif()
老实说,这些是我在谷歌上搜索过的各种来源的整理,我理解一般的想法,但不是细节,有些事情可能是错误的。
在我的第二个库(libB)中,我想导入 libA :
cmake_minimum_required(VERSION 3.5)
project(libB VERSION 0.1.0 LANGUAGES C)
# Required packages
find_package(libA)
# Files
set(PUBLIC_HEADERS
includes/libB.h
)
set(SOURCE_FILES
sources/libB.c
)
# Shared library
add_library(libB SHARED
${SOURCE_FILES}
)
set_target_properties(libB PROPERTIES
PUBLIC_HEADER "${PUBLIC_HEADERS}"
INTERFACE_LINK_LIBRARIES "libA"
)
# Include paths
target_include_directories(libB
PUBLIC
$<INSTALL_INTERFACE:include>
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/includes>
)
# Link
target_link_libraries(libB
PUBLIC libA
)
目前,这在 libB 的链接上给出了一个错误:LNK1181 无法打开输入文件 'libA-NOTFOUND.obj'
何做这个链接?(并寻找合适的 lib/so 文件)?
我在出口/进口的正确道路上吗?
我错过了什么?
请提供一些上下文和/或一些解释,以便我能理解我在做什么;-)
解决方案
在@Tsyvarev 的评论之后,我修复了以下问题:
CONFIGURATIONS Debug|Release
-->
CONFIGURATIONS Debug Release
set_target_properties(libB PROPERTIES
PUBLIC_HEADER "${PUBLIC_HEADERS}"
INTERFACE_LINK_LIBRARIES "libA"
)
-->
set_target_properties(libB PROPERTIES
PUBLIC_HEADER "${PUBLIC_HEADERS}"
)
find_package(libA)
-->
find_package(libA REQUIRED)
我清理了所有东西,清除了缓存,然后它工作了!libB 中不再有链接问题。非常感谢齐瓦列夫!
推荐阅读
- c# - YamDocument 到文本表示以 3 个点结尾
- node.js - 后端设计——处理单个资源和多个资源,还是只处理多个?
- python - 卸载在 C++ 中使用 dlopen() 打开的共享对象(.so 文件)
- javascript - Edge 和 IE 中的 JsRender/JsViews 性能问题
- rest - 来自 Insomnia 和 Postman 对 WebRequest 的不同响应
- c# - ASP.NET Core 2.0+ - 如何使声明保持最新
- javafx - JavaFX 应用程序名称未显示在任务管理器或 Dock 中
- c# - 作为来自 Localhost 的虚拟应用服务标识向 KeyVault 进行身份验证
- python - 使用 Pyhon 将数据插入 RedShift
- c - MAX 在编译时?