对于我的研究项目,我正在建立一个项目(coom
),以对数据结构上的一组算法进行基准测试。对于单元测试,我选择了Bandit,这使我有了一个如下所示的项目结构:
+ root
|-- CMakeLists.txt
|-+ external/
| \-- bandit/
|-+ src/
| |-- CMakeLists.txt
| |-- node.cpp
| \-- node.h
\-+ test/
|-- CMakeLists.txt
|-- test.cpp
\-- test_node.cpp
根据我使用其他语言的经验,在我看来这是标准的项目结构吗?
test/
文件夹在src/
中包含逻辑的单元测试,并且没有依赖项与源代码和测试代码混合在一起,而在external/
中。我的测试文件希望如下所示(删除了不相关的部分)
// test/test.cpp
#include <bandit/bandit.h>
(...)
#include "test_node.cpp"
int main(int argc, char* argv[]) {
(...)
}
// test/test_node.cpp
#include <coom/node.h>
(...)
但是我的问题是,当我尝试使用
cmake ..
和后续的Makefile
进行编译时,他们无法在src/
中找到源代码,从而导致编译器错误:fatal error: coom/node.h: No such file or directory.
我希望
test/CMakeLists.txt
应该看起来像以下内容:# test/CMakeLists.txt
add_executable (test_unit test.cpp)
target_link_libraries(test_unit coom)
我无法弄清楚如何设置
CMakeLists.txt
和src/CMakeLists.txt
来确保获得上述期望的结果。当前,它们如下所示:# CMakeLists.txt
cmake_minimum_required(VERSION 3.8)
project (coom VERSION 0.1)
# ============================================================================ #
# Dependencies
(...)
# ============================================================================ #
# COOM project
add_subdirectory (src)
add_subdirectory (test)
# src/CMakeLists.txt
# ============================================================================ #
# Link up files for the library
set(HEADERS
node.h
)
set(SOURCES
node.cpp
)
add_library(coom ${HEADERS} ${SOURCES})
我可以从其他项目中看到,可以将
src/
目录链接到一些libname/
前缀,但是我无法从他们的CMakeLists.txt
文件中看出我做错了什么。我已经看过编写coom.pc.in
文件并提供install
-target的情况,并尝试使用set_target_properties
或FOLDER coom
来PREFIX coom
,但是都没有用。我可以将include_directory(../src)
修改为test/CMakeLists.txt
以便能够通过#include <node.cpp>
包含该文件,但是这让我大叫一声。在这一点上,我非常忙碌,而CMake文档对我几乎没有帮助。
最佳答案
您的coom
目标没有定义包含目录。您可以定义用于此目标的包含目录(通过 target_include_directories()
),并传播这些包含目录,以便它们对使用中的test_unit
目标可见(通过使用PUBLIC
):
# src/CMakeLists.txt
# ============================================================================ #
# Link up files for the library
set(HEADERS
node.h
)
set(SOURCES
node.cpp
)
add_library(coom ${HEADERS} ${SOURCES})
target_include_directories(coom PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})
此外,
node.h
header 的文件路径是coom/src/node.h
,而不是coom/node.h
。但是,由于您现在已将coom/src
作为公共(public)包含目录,因此可以使用以下内容在测试文件中包括node.h
header :#include <node.h>