我在为我的项目创建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-这就是为什么您尝试在此处手动修改包含路径的原因。
理想情况下,您需要遵循两种可能的路径:
不幸的是,虽然可以使用
add_subdirectory
添加一个不是当前目录的子目录的目录,但是不建议这样做。因此,要遵循这种方法,您将必须:
add_subdirectory
添加project1-这再次意味着project1将使用projectAB目标。