Cmake-导出和导入库

时间:2018-10-22 09:19:55

标签: cmake

CMake导出/导入库

我想以可移植的方式(Windows和Linux)在cmake中导出和导入库。 我想使用安装目标和导出命令来正确,干净地执行此操作,但是它们非常隐秘且文档完整(尽管完整),因此绝对没有上下文或容易学习的示例。 目前,我有libA的cmakelist:

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()

说实话,这些是我从Google搜集到的各种来源的整理资料,我了解通用的想法,但不了解细节,有些事情可能是错误的。

在我的第二个lib(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文件)?

我在正确的导出/导入路径上吗?

我想念什么?

请提供一些背景信息和/或一些解释,以便我可以了解自己在做什么;-)

1 个答案:

答案 0 :(得分:0)

在@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中没有更多的链接问题。非常感谢Tsyvarev!