我正在尝试使用CMake编写一个仅由其他人导入的头文件库。我试图遵循Daniel Pfeifer的指示 - " Effective CMake"。但是,我无法将头文件包含到另一个项目中。为了说明的目的,我创建了一个具有树形结构的类似玩具项目:
├── testinclude
│ ├── CMakeLists.txt
│ └── testinclude.cpp
└── testlib
├── CMakeLists.txt
├── include
│ └── testLib.h
└── testLibConfig.cmake
虽然库应该是包含
的testLib.hvoid 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,即使我之前没有抱怨或错误。
答案 0 :(得分:1)
我认为您的安装不包含头文件。
使用set_target_properties(tgt PROPERTIEs PUBLIC_HEADER "${HEADER_FILES}")
并安装PUBLIC_HEADER以安装它们(警告不允许子目录)
安装中也不应使用“包含DESTINATION”,尝试使用target_include_directories()
代替(“包括”这是对现代CMake的回忆)。只需要添加安装包含目录...
对我来说似乎不错...... 例如https://github.com/Mizux/cmake-cpp/blob/master/Foo/CMakeLists.txt src:https://cmake.org/cmake/help/latest/prop_tgt/PUBLIC_HEADER.html
答案 1 :(得分:0)
Tsyvarev的评论绝对正确。另外安装公共头文件&#34; testLib.h&#34; (进入某个独立于项目的位置)是缺少的事情。 添加行
install(FILES "${CMAKE_CURRENT_SOURCE_DIR}/include/testLib.h" DESTINATION
include/testLib )
到&#34; testLib / CMakeLists.txt&#34; 解决了这个问题。