cmake mutliple цели - один заголовок только цель, а другой исполняемый файл - PullRequest
0 голосов
/ 15 апреля 2019

Основываясь на этом ответе stackoverflow на аналогичный вопрос ( Cmake включает цель только заголовок из цели только заголовок ), я создаю библиотеку только заголовок и пытаюсь использовать ее в исполняемом файле.

Моя структура папок ниже:

├── CMakeLists.txt   // root folder CMake file
├── srcs             // this is the hdr only library
│   ├── src1.hpp
│   ├── CMakeLists.txt
│   ├── src2.hpp
│   └── src3.hpp
│   └── ...
└── test             // this is the executable project
    ├── CMakeLists.txt
    └── main.cpp

Корневой уровень CMakeLists.txt

cmake_minimum_required(VERSION 3.13)
project (MyProj CXX) 

add_subdirectory(srcs)
add_subdirectory(test)

уровень src CMakeLists.txt (только для библиотеки заголовков)

add_library(MyLib INTERFACE)
target_sources(MyLib  INTERFACE
  "${CMAKE_CURRENT_SOURCE_DIR}/src1.hpp"
  "${CMAKE_CURRENT_SOURCE_DIR}/src2.hpp"
  "${CMAKE_CURRENT_SOURCE_DIR}/src3.hpp"
  )
target_include_directories(MyLib 
  INTERFACE ${CMAKE_CURRENT_BINARY_DIR})
add_subdirectory(plugins)

CMake-файл для исполняемого тестового проекта

add_executable(MyTest main.cpp)

target_sources(MyTest 
    PRIVATE main.cpp
)

target_include_directories(MyTest PUBLIC
  $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>)

target_link_libraries(MyTest PUBLIC MyLib)

Хотя это настраивает cmake без предупреждений / ошибок, запуск make завершается неудачно, указывая на то, что исполняемый проект не может найти заголовочный файл (ы) из библиотеки.

/ ... / nettu2 / test / main.cpp: 6: 10: фатальная ошибка: src1.hpp: нет такого файл или каталог #include "src1.hpp" ^ ~~~~~~~~~~~~~~~ Компиляция прекращена. test / CMakeFiles / MyTest.dir / build.make: 62: рецепт для цели 'test / CMakeFiles / MyTest.dir / main.cpp.o' не удалось сделать [2]: * [test / CMakeFiles / MyTest.dir / main.cpp.o] Ошибка 1 CMakeFiles / Makefile2: 126: рецепт для цели «test / CMakeFiles / MyTest.dir / all» не удалось сделать [1]: * [test / CMakeFiles / MyTest.dir / all] Ошибка 2 Makefile: 129: рецепт для цель 'all' не выполнена make: *** [all] Ошибка 2

Я уверен, что мне здесь не хватает какой-то важной, но тривиальной вещи, но все же не могу понять, что здесь происходит не так. Как я могу заставить эту сборку работать?

1 Ответ

1 голос
/ 15 апреля 2019

В этой строке есть небольшая ошибка:

target_include_directories(MyLib 
  INTERFACE ${CMAKE_CURRENT_BINARY_DIR})

Указанный вами каталог включения для MyLib расширяется до каталога build , соответствующего srcs, т.е.в вызове, подобном

clang++ /path/to/build/test/test.cpp -I /path/to/build/srcs ...

, но вы хотите передать фактический каталог source препроцессору.Чтобы это исправить, попробуйте

target_include_directories(MyLib 
   INTERFACE ${CMAKE_CURRENT_SOURCE_DIR})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...