#c #c 11 #cmake
#c #c 11 #cmake
Вопрос:
У меня есть проект CMake со структурой каталогов ниже:
. ├── b.h ├── CMakeLists.txt ├── src └── test ├── CMakeLists.txt ├── impl └── include └── a.h
Я хочу включить b.h
, a.h
но CMake не может найти b.h
a.h
. Я знаю, что это неправильно, если я включаю a.h
в b.h
то время как включаю b.h
a.h
. Однако я уверен, что a.h
это будет использоваться только в файлах в test/impl
.
Содержимое ./CMakeLists.txt
просто добавляется test/
в качестве подкаталога.
Содержимое ./test/CMakeLists
генерирует исполняемый объект, который использовал googletest.
Есть ли что-нибудь, что я могу включить b.h
, a.h
не добавляя дополнительный файл CMake ./test/include
?
./CMakeLists.txt
file(GLOB_RECURSE SOURCES src/*.cpp) add_library(core SHARED ${SOURCES}) target_include_directories(core PUBLIC ${PROJECT_SOURCE_DIR}) add_subdirectory(test)
./test/CMakeLists.txt
file(GLOB_RECURSE SOURCES impl/*.cpp) enable_testing() add_executable( core_test ${SOURCES} ) target_link_libraries( core_test gtest_main ) include(GoogleTest) gtest_discover_tests(core_test) target_include_directories(core_test PUBLIC ${PROJECT_SOURCE_DIR})
Комментарии:
1. Команда
target_include_directories
добавляет те каталоги include, которые вы в ней указываете. Таким образом, вы можете вызвать эту команду с${PROJECT_SOURCE_DIR}/test/include
последним аргументом, чтобы она добавляласьtest/include
как каталог включения.2. Похоже, это используется для включения
a.h
вb.h
. Что я хочу сделать, так это включить файл снаружи(b.h
) из файла внутри(a.h
). Есть ли какие-нибудь идеи?3. Что ж, похоже, есть компромисс. Я добавляю файл cpp в файл
./test/impl
cpp и включаюa.h
его в файл cpp. Тогдаb.h
можно было бы найти вa.h
. Однако возможно ли не добавлять дополнительный файл cpp, а только изменять файл CMake, чтобы реализовать это?