Link up src/ 以 CMake 作为库 #include'd 带有一些 `libname/` 前缀
Link up src/ with CMake as library #include'd with some `libname/` prefix
对于我的研究项目,我正在建立一个项目 (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})
我从其他项目中看到,可以 link 带有一些 libname/
前缀的 src/
目录,但我无法从他们的 CMakeLists.txt
文件中辨别出来我做错了什么。我研究过编写一个 coom.pc.in
文件并提供一个 install
-target,并尝试使用 FOLDER coom
或 PREFIX coom
来 set_target_properties
,但都没有用。我可以将 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>
对于我的研究项目,我正在建立一个项目 (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})
我从其他项目中看到,可以 link 带有一些 libname/
前缀的 src/
目录,但我无法从他们的 CMakeLists.txt
文件中辨别出来我做错了什么。我研究过编写一个 coom.pc.in
文件并提供一个 install
-target,并尝试使用 FOLDER coom
或 PREFIX coom
来 set_target_properties
,但都没有用。我可以将 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>