Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/137.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ CMakeList用于just headers项目,并在另一个项目中使用它_C++_Cmake_Header - Fatal编程技术网

C++ CMakeList用于just headers项目,并在另一个项目中使用它

C++ CMakeList用于just headers项目,并在另一个项目中使用它,c++,cmake,header,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") | | --- CMak

我在为我的项目创建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指南和其他一些资料(),最后我为其编写了以下CMAKEL列表:

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
)
现在我想使用Project1ProjectAB的标题。由于不相关的原因,我不得不安装它们。我不确定这两个项目的CMakeLists应该是什么样子

我为项目1想到了这一点:

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的CmakeList所在的位置,您可能会遇到类似的问题

另外,您没有使用CMakeLists for projectAB来构建project1,但是您应该在那里指定包含目录,而不是实际的头文件-简单的include_directories调用也不是必需的:通过为目标指定接口包含目录,任何依赖于该目标的内容都会将这些目录添加到其包含路径中

另一个问题是您的project1实际上并不依赖于projectAB,这就是为什么您试图手动修改其中的include路径

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

  • 如果这两个项目大部分是单独开发的,您可以使用cmake for project1的find package功能来查找projectAB
  • 如果它们通常一起开发(基于布局,我假设是这样),那么应该使用add_子目录将projectAB cmakelists添加到project1中。之后,projectAB目标将可用,您可以将其作为依赖项添加到project1
不幸的是,虽然可以使用
add_subdirectory
添加一个不是当前目录子目录的目录,但不建议这样做

因此,要采用这种方法,您必须:

  • 将projectAB移动为project1的子目录
  • 或者添加一个“根”CMakeLists,它首先添加projectAB,然后使用
    add\u子目录添加project1,这同样意味着project1将使用projectAB目标

嗨,杜托,首先感谢您抽出时间。我用CMakeLists的位置和正确的include_目录(${CMAKE_CURRENT_SOURCE_DIR}/./projectAB/include)更新了这个问题。我想知道你说的关于在内部添加projectAB的内容,但我不能将其添加为子目录,因为还有其他项目(Project2,Project3…)与使用ProjectAB的Project1的结构完全相同。因此,在每一张纸上复制一份会有点脏。我也在考虑让CMake“可查找”ProjectAB的选项,但我想知道是否还有更多选项。另一个常用选项是我在这里提到的:在包含project1和ProjectAB的目录中添加一个“顶级”cmakefile,并将两个项目都添加为子目录。