cmake, уточнение по include_directories

0

Я пытаюсь использовать cmake, но я новичок как для cmake, так и для c++. Я хотел бы иметь часть кода для использования в других программах. Структура папок выглядит так:

/modules/foo
/modules/foo/src
/modules/foo/include/foo
/cmake
/apps/bar
/apps/bar/src
/apps/bar/include

Моя проблема заключается в том, что в основной строке я могу включать (и компилировать и запускать) оба

#include "foo.h"
#include "foo/foo.h"

Я думаю, что это признак того, что что-то не так. Я ищу что-то вроде

#include "foo.h" // only inside the foo source code

#include "foo/foo.h" // outside

Если я удалю include_directories(include/foo) из /modules/foo/CMakeLists.txt, я получаю компиляционную ошибку, в которой говорится, что файл "foo.h" не найден в /modules/foo/src/foo.cpp

Если я include_directories(${CMAKE_CURRENT_LIST_DIR}/../modules/foo/include) из FindFoo.cmake, я получаю ошибку в файле 'foo/foo.h' не найден/apps/bar/src/main.cpp

Что я могу сделать? Какова распространенная практика решения таких проблем? Должен ли я игнорировать тот факт, что в apps/bar/src/main.cpp я могу включить и foo.h и foo/foo.h? Должен ли я писать include_directories только один раз и использовать #include "foo/foo.h также в foo.cpp?

Теги:
cmake

1 ответ

1
  • Создайте отдельный каталог foo с помощью foo.h и foo.cpp. В foo.cpp поместите #include "foo.h", возможно, в первую очередь включите его
  • Добавьте файл CMakeLists.txt для создания библиотеки foo, команды add_library.
  • Добавьте include_directories(${CMAKE_SOURCE_DIR}) в преамбуле основного CMakeLists.txt
  • Из всего остального в проекте вы можете включить свой foo.h, указав #include "foo/foo.h". Вы делаете это, не забудьте связать с foo библиотекой команду target_link_libraries.

Драгоценная ссылка: http://www.cmake.org/cmake/help/v2.8.11/cmake.html#section_Commands

  • 0
    Хорошо, так в том же каталоге .. но так почему многие библиотеки cpp имеют структуру: mylib/include/mylib и mylib/src ?
  • 0
    @nkint Как кто-то уже сказал, это дело вкуса и немного в контексте того, что вы делаете: если вы пишете эту библиотеку, и вы будете использовать эту библиотеку, я предлагаю вам сохранить и заголовок и источники вместе. Если это библиотека, которую вы собираетесь распространять в виде двоичного файла, вы можете поместить в каталог include заголовки с интерфейсом. Опять же, это дело вкуса, и вы увидите множество возможных мотивов, чтобы проверить это и связать это: stackoverflow.com/questions/13967296/…

Ещё вопросы

Сообщество Overcoder
Наверх
Меню