2015-04-11 3 views
1

Я разрабатываю продукт с командой, использующей CMake. У нас есть несколько проектов Visual Studio (библиотеки и исполняемые файлы) внутри нашего проекта CMake, которые ссылаются на другие заголовки проектов (через target_include_directories()). В исходном файле этот заголовок включает выглядеть следующим образом:Как включить каталоги с относительными путями проектов в CMake?

#include "some_header.h" // from project_x 
#include "another_header.h" // from project_y 

Я хотел бы иметь возможность включить эти заголовки с путями, которые ссылаются на проект они вытягивают из, например:

#include "project_x/some_header.h" 
#include "project_y/another_header.h" 

Что наиболее приемлемый способ сделать это? Я подумал о нескольких решениях:

  1. Добавить каталог, содержащий проект в качестве пути включения. Это имеет нежелательный побочный эффект, включая все и кажется плохим решением.

  2. Включить вложенную папку проекта под названием «включить», который содержит папку с именем, таким же, как проект, который создает несколько избыточного путь: /<project_name>/include/<project_name>/<...>

Существует третье решение, использовать общий каталог include с подпапкой для каждого проекта, но он не будет работать для нашего проекта, потому что мы группируем наши проекты сборки по категориям в файловой системе и решении Visual Studio, и это приведет к тому, что структура папок внутри /include/ будет отличаться от остальных исходного дерева, что нежелательно.

Есть ли лучшие (или более канонические/идиоматические) способы достижения этого?

ответ

1

Если у вас есть структура проекта, как это:

project_x/some_header.h 
project_y/another_header.h 

и вы хотите сохранить все ваших CMakeLists то же самое, то я бы ввести другую папку в каждом проекте:

project_x/project_x/some_header.h 
project_y/project_y/another_header.h 

Конечно, это требует изменения включений в каждом проекте, чтобы отразить эту новую структуру, включая проект, в котором заголовок определен правильно.

Есть некоторые прецеденты к этому, так как это curl и googletest сделать это.

Редактировать: Я понимаю, что это очень похоже на второй подход, который вы указали. Если в вашей структуре каталогов уже используются каталоги include, то мое предложение в точности совпадает с вашим вторым. По крайней мере, это должно подтвердить вашу интуицию, что это не совсем абсурдная вещь, даже если она создает некоторую избыточность.

Смежные вопросы