Соедините src / с CMake в качестве библиотеки # include'd с некоторым префиксом `libname /` - PullRequest
1 голос
/ 13 апреля 2020

Для моего исследовательского проекта я настраиваю проект (coom) для сравнения набора алгоритмов в структуре данных. Для модульного тестирования я остановился на Bandit , что оставляет мне структуру проекта, которая выглядит следующим образом:

+ root
|-- CMakeLists.txt
|-+ external/
| \-- bandit/
|-+ src/
| |-- CMakeLists.txt
| |-- node.cpp
| \-- node.h 
\-+ test/
  |-- CMakeLists.txt
  |-- test.cpp
  \-- test_node.cpp

Из моего опыта работы с другими языками это кажется мне стандартной структурой проекта ? Папка test/ содержит модульные тесты для логики c в src/ и никакие зависимости не смешиваются с исходным кодом и тестовым кодом, а вместо этого находятся в external/.

Файлы тестирования I хочу выглядеть следующим образом (с удаленными нерелевантными частями)

// 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 и попытался set_target_properties с FOLDER coom или PREFIX coom, но ни сработало. Я могу взломать include_directory(../src) в test/CMakeLists.txt, чтобы иметь возможность включить файл через #include <node.cpp>, но это кричит, что я делаю что-то по своей сути неправильно.

Я на этом этапе очень сильно выдернуть мои волосы, и документация по CMake мне очень мало поможет.

1 Ответ

1 голос
/ 13 апреля 2020

Ваша цель 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 равен coom/src/node.h, а не coom/node.h. Но, поскольку теперь у вас есть coom/src в качестве общедоступного каталога c, вы можете использовать следующее для включения заголовка node.h в ваш тестовый файл:

#include <node.h>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...