【发布时间】: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() 检索到的信息,为什么它在这里不起作用?
类似问题:
- 我的库 cmake 主要基于:How to create a shared library with cmake?
- 同样的问题,但我已经在使用
target_include_directories:Cmake Linking Shared Library: "No such file or directory" when include a header file from library
【问题讨论】:
-
据我所知
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