c++ - cmake - 找不到共享库的头文件
问题描述
我正在制作一个我希望为用户安装的自定义库。但是,当我尝试在 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()
检索到的信息,为什么它在这里不起作用?
类似的问题:
- 我的库 cmake 主要基于:如何使用 cmake 创建共享库?
- 同样的问题,但我已经在使用
target_include_directories
:Cmake Linking Shared Library: "No such file or directory" when include a header file from library
解决方案
当共享库目标在配置文件中命名空间时,使用时需要在下游包中使用全名引用它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")
推荐阅读
- draw2d - 如何始终在前台显示天狼星标签
- python - 在 Python 中存储矩阵元素的更快方法
- javascript - 如何滚动到反应js中的特定ID?
- python - 在 Python 中使用 cx_Oracle 中的 executemany() 从批量插入数据加载中查找错误记录
- glsl - 如何为 glsl 结构成员指定 null?
- ruby-on-rails - 如何在 Nokogiri 中创建带有冒号属性的 xml 元素
- r - 如何使用 quanteda 查找句子中某些单词出现在某些其他单词之前的实例
- php - 在可以重新访问的 PHP 脚本中设置临时变量
- javascript - 将所有内部标签放入其容器中
- javascript - javascript从单独的字符串中替换循环中的文本