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

时间:2018-04-15 10:52:42

标签: c++ cmake

我正在尝试使用CMake编写一个仅由其他人导入的头文件库。我试图遵循Daniel Pfeifer的指示 - " Effective 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,即使我之前没有抱怨或错误。

2 个答案:

答案 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; 解决了这个问题。