为什么我无法包含来自 cmake 导出/导入库的头文件

Why am I not able to include header file from cmake exported/imported library

本文关键字:导入 文件 导出 cmake 包含 为什么      更新时间:2023-10-16

我正在尝试使用 CMake 编写一个仅供其他人导入的标头库。我试图遵循Daniel Pfeifer的指示 - "有效的CMake"。但是,我无法将头文件包含在另一个项目中。为了便于说明,我创建了一个类似的玩具项目,具有树形结构:

├── testinclude
│   ├── CMakeLists.txt
│   └── testinclude.cpp
└── testlib
├── CMakeLists.txt
├── include
│   └── testLib.h
└── testLibConfig.cmake

而库应该是 testLib.h 包含

void sayHello(){
    std::cout<<"Hello"<<'n';
}

可执行测试的源代码包括.cpp如下所示:

#include"testLib.h"
int main(){
    sayHello();
    return 0;
}

试图遵循Daniel Pfeifers指南,我的CMakeLists.txt在目录中testlib看起来像:

cmake_minimum_required(VERSION 3.5)
project(testLib VERSION 0.1)
add_library(testLib INTERFACE )
target_include_directories(testLib INTERFACE 
    $<INSTALL_INTERFACE:include>
)
install(TARGETS testLib EXPORT testLibTargets
    INCLUDES DESTINATION include
)
install(EXPORT testLibTargets
    FILE testLibTargets.cmake
    NAMESPACE testLib::
    DESTINATION lib/cmake/testLib
)
include(CMakePackageConfigHelpers)
write_basic_package_version_file("testLibConfigVersion.cmake"
    VERSION ${testLib_VERSION}
    COMPATIBILITY SameMajorVersion
)
install(FILES "testLibConfig.cmake" "testLibConfigVersion.cmake"
    DESTINATION lib/cmake/testLib
)

和testLibConfig.cmake:

include("${CMAKE_CURRENT_LIST_DIR}/testLibTargets.cmake")

最后结束 CMakeList .txt 在目录中测试包括:

cmake_minimum_required(VERSION 3.5)
project(testInclude)
add_executable(testInclude testinclude.cpp)
find_package(testLib)
target_link_libraries(testInclude PRIVATE testLib::testLib)

在目录 testlib 中运行后:

cmake .
sudo make install

并在 testinclude 目录中运行:

cmake .
make

我收到错误,testLib.h未找到,即使我之前没有抱怨或错误。

齐瓦列夫的评论是绝对正确的。此外,将公共头文件"testLib.h"(安装到独立于项目的某个位置(是缺少的事情。添加行

install(FILES "${CMAKE_CURRENT_SOURCE_DIR}/include/testLib.h" DESTINATION
include/testLib )

到"testLib/CMakeLists.txt"修复了问题。

我认为您的安装不包括头文件。使用set_target_properties(tgt PROPERTIEs PUBLIC_HEADER "${HEADER_FILES}")并在安装中PUBLIC_HEADER以安装它们(警告不允许子目录(

此外,不应使用安装中的"包含目标",请尝试使用target_include_directories()代替("包含"是对前现代CMake的回忆(。当您要添加安装包含目录时,它只是需要...

否则对我来说似乎很好...例如 https://github.com/Mizux/cmake-cpp/blob/master/Foo/CMakeLists.txt来源:https://cmake.org/cmake/help/latest/prop_tgt/PUBLIC_HEADER.html