我在为项目创建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
.
)
但它不优雅,也不起作用。
这样做的正确方法是什么?
答案 0 :(得分:1)
首先,您将错误的目录标记为包含文件的位置:
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/../projectAB)
根据你的目录树,这些文件位于projectAB / include中,而不是直接在projectAB中。
根据projectAB的CMakeLists所在的位置,您可能会遇到类似的问题。
另外,你没有使用projecta的CMakeLists来构建project1,但你应该在那里指定include目录,而不是实际的头文件 - 而简单的include_directories调用也是不必要的:通过为目标指定接口包含目录,任何取决于该目标的东西都会将这些目录添加到它包含路径。
另一个问题是你的project1实际上并不依赖于projectAB - 这就是你尝试手动修改包含路径的原因。
理想情况下,您可能希望遵循两条可能的路径:
不幸的是,虽然可以使用add_subdirectory
添加不是当前目录子项的目录,但不建议这样做。
所以要遵循这种方法,你必须要么:
add_subdirectory
添加project1 - 这也意味着project1将使用projectAB目标。