我正在尝试使用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”
解决了问题。