CMakeList仅用于标题项目并在另一个项目中使用它

时间:2017-09-28 09:31:13

标签: c++ cmake header

我在为项目创建CMakeList时遇到了一些问题。我有以下结构:

ProjectAB
|
|--- include
|     |--- A.h
|     |--- B.h
|
| --- CMakeList.txt

Project1
|
|--- include
|     |--- src1.h
|
|--- src
|     |--- src1.cpp (#include "src1.h"; #include "A.h"; #include "B.h")
|
| --- CMakeList.txt

ProjectAB 只是由标题组成,所以我一直在阅读CMake指南和其他一些来源(link),最后我为它编写了以下CMakeList:

cmake_minimum_required(VERSION 3.6.1)

project(lib_projectAB VERSION 1.0.0 LANGUAGES CXX)

add_library(projectAB INTERFACE)

include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include)

target_include_directories(projectAB 
    INTERFACE
        A.h
        B.h
)

现在我想在 Project1 中使用 ProjectAB 的标题。由于无关的原因,我必须安装它们。我不确定这两个项目的CMakeLists应该是什么样子。

我想到了 Project1

cmake_minimum_required(VERSION 3.6.1)

project(lib_project1 VERSION 1.0.0 LANGUAGES CXX)

add_subdirectory(src)

include_directories(${CMAKE_CURRENT_SOURCE_DIR}/../projectAB/include)

add_library(project1
    STATIC
        src1.h
        src1.cpp
)

target_link_libraries(project1
    PUBLIC
        third_party_LIBRARIES
        lib_projectAB
)

install(
    FILES
        src1.h
        A.h
        B.h
    DESTINATION
        .
)

但它不优雅,也不起作用。

这样做的正确方法是什么?

1 个答案:

答案 0 :(得分:1)

首先,您将错误的目录标记为包含文件的位置:

include_directories(${CMAKE_CURRENT_SOURCE_DIR}/../projectAB)

根据你的目录树,这些文件位于projectAB / include中,而不是直接在projectAB中。

根据projectAB的CMakeLists所在的位置,您可能会遇到类似的问题。

另外,你没有使用projecta的CMakeLists来构建project1,但你应该在那里指定include目录,而不是实际的头文件 - 而简单的include_directories调用也是不必要的:通过为目标指定接口包含目录,任何取决于该目标的东西都会将这些目录添加到它包含路径。

另一个问题是你的project1实际上并不依赖于projectAB - 这就是你尝试手动修改包含路径的原因。

理想情况下,您可能希望遵循两条可能的路径:

  • 如果两个项目大多是单独开发的,您可以使用cmake的find包功能为project1找到projectAB
  • 如果它们通常一起开发(基于布局,我假设是这种情况),您应该使用add_subdirectory将projectAB ckkelists添加到project1。之后,projectAB目标将可用,您可以将其作为依赖项添加到project1。

不幸的是,虽然可以使用add_subdirectory添加不是当前目录子项的目录,但不建议这样做。

所以要遵循这种方法,你必须要么:

  • 将projectAB移动到project1的子目录
  • 或添加" root" CMakeLists,它首先添加projectAB,然后使用add_subdirectory添加project1 - 这也意味着project1将使用projectAB目标。