C++ CMakeList用于just headers项目,并在另一个项目中使用它
我在为我的项目创建CMakeList时遇到了一些问题。我的结构如下: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
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
)
现在我想使用Project1中ProjectAB的标题。由于不相关的原因,我不得不安装它们。我不确定这两个项目的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目标