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

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

而该库应该是包含testLib.h
void sayHello(){
    std::cout<<"Hello"<<'\n';
}

可执行文件testinclude.cpp的源代码如下:
#include"testLib.h"

int main(){
    sayHello();
    return 0;
}

尝试遵循Daniel Pfeifers指南,我的目录teSTLib中的CMakeLists.txt看起来像:
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")

最后结束目录testinclude中的CMakeLists.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的错误,即使我之前没有任何抱怨或错误。

最佳答案

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

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

到“testLib / CMakeLists.txt”
解决了问题。

10-08 09:16