我在为我的项目创建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 的标题。由于不相关的原因,我必须安装它们。我不确定两个项目的CMakeList看起来如何。

我想到了 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
        .
)

但是它并不优雅,也没有用。

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

最佳答案

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

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

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

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

另外,您并没有使用projectAB的CMakeLists来构建project1,而是应该在其中指定包含目录,而不是实际的头文件-并且简单的include_directories调用也是不必要的:通过指定接口(interface)目标的包含目录,所有取决于目标会将这些目录添加到其包含路径。

另一个问题是您的project1实际上并不依赖projectAB-这就是为什么您尝试在此处手动修改包含路径的原因。

理想情况下,您需要遵循两种可能的路径:
  • 如果两个项目大多是分别开发的,则可以使用cmake的project 1的查找包功能来查找projectAB
  • 如果通常将它们一起开发(基于布局,我假设是这种情况),则应使用add_subdirectory将projectAB cmakelist添加到project1。之后,projectAB目标将可用,您可以将其作为依赖项添加到project1。

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

    因此,要遵循这种方法,您将必须:
  • 将projectAB移至project1的子目录
  • 或添加一个“根” CMakeLists,该列表首先添加projectAB,然后使用add_subdirectory添加project1-这再次意味着project1将使用projectAB目标。
  • 08-04 14:56