【问题标题】:cmake - Header files of shared library not foundcmake - 找不到共享库的头文件
【发布时间】:2021-04-12 08:54:05
【问题描述】:

我正在制作一个自定义库,我希望它可以为用户安装。但是,当我尝试在 cmake 可执行文件中使用我自己的库时,我收到一个构建错误,提示找不到库头。

图书馆CMakeLists.txt:

cmake_minimum_required(VERSION 3.16)
project(mylibrary)

include(GNUInstallDirs)

set(CMAKE_CXX_STANDARD 14)

# Register a library - This will created lib[xxx].so
add_library(mylibrary SHARED src/library.cpp)

configure_file(mylibrary.pc.in mylibrary.pc @ONLY)

# List the /include directory
target_include_directories(mylibrary PUBLIC
        $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>  
        $<INSTALL_INTERFACE:include>)

install(TARGETS mylibrary
        EXPORT mylibraryConfig
        LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR})

export(TARGETS mylibrary
        FILE "${CMAKE_CURRENT_BINARY_DIR}/mylibraryConfig.cmake")

install(EXPORT mylibraryConfig
        DESTINATION "${CMAKE_INSTALL_LIBDIR}/mylibrary/cmake"
        NAMESPACE mylibraryConfig::)

install(
        DIRECTORY include
        DESTINATION ${CMAKE_INSTALL_PREFIX})

install(FILES ${CMAKE_BINARY_DIR}/mylibrary.pc
    DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/pkgconfig)

我成功构建和安装的:

$ cmake .. -DCMAKE_INSTALL_PREFIX=~/libraries/local  # Use non-standard destination
$ make && make install

可执行文件CMakeLists.txt:

cmake_minimum_required(VERSION 3.16)
project(myexecutable)

set(CMAKE_CXX_STANDARD 14)

find_package(mylibrary REQUIRED)

add_executable(myexecutable src/main.cpp)

target_link_libraries(myexecutable PUBLIC mylibrary)

target_include_directories(myexecutable PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/include)

我可以为这个项目准备 cmake:

$ cmake .. -DCMAKE_PREFIX_PATH=~/libraries/local # Use non-standard location

但是,构建它失败了:

$ make
fatal error: mylibrary/library.h: No such file or directory
    2 | #include <mylibrary/library.h>

据我了解,库(二进制文件和头文件)的位置嵌入在已安装的包中。并且通过find_package() 检索到的信息,为什么它在这里不起作用?

类似问题:

【问题讨论】:

  • 据我所知find_package() 可能不会成功,甚至不会报告任何关于此的消息:https://stackoverflow.com/questions/2711654...
  • 如果我为程序运行cmake ..(没有DCMAKE_PREFIX_PATH),我会收到一个类似“找不到包mylibrary”的错误。所以我倾向于认为这部分有效。
  • 当您在配置文件中为共享库目标命名时,您需要在使用find_package 时使用全名引用它,即在target_link_libraries 命令中使用mylibraryConfig::mylibrary
  • 是的,就是这样!我刚刚删除了NAMESPACE 位。如果您将此作为答案发布,我会接受。或者我稍后会自己发布。

标签: c++ cmake shared-libraries header-files


【解决方案1】:

当共享库目标在配置文件中命名空间时,使用find_package时需要在下游包中使用全名引用它,即需要使用

target_link_libraries(myexecutable PUBLIC mylibraryConfig::mylibrary)

或者,通过替换从安装中删除命名空间

install(EXPORT mylibraryConfig
        DESTINATION "${CMAKE_INSTALL_LIBDIR}/mylibrary/cmake"
        NAMESPACE mylibraryConfig::)

...与:

install(EXPORT mylibraryConfig
        DESTINATION "${CMAKE_INSTALL_LIBDIR}/mylibrary/cmake")

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-10-03
    • 1970-01-01
    • 1970-01-01
    • 2012-09-30
    • 2021-07-17
    • 2015-04-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多