2014-10-03 4 views
0

Я полагаю, это так просто, что никто не хочет записывать его, но я не могу понять это. Рассмотрим тривиальный пример.Построить дерево проекта в CMake

ProjectTree 
    |- CMakeLists.txt 
    |- Library1 
    | |- CMakeLists.txt 
    | |- src 
    | |- include 
    |- Library2 # depends on Library1 
    | |- CMakeLists.txt 
    | |- src 
    | |- include 
    |- Program1 # depends on Library2 (not directly on Library1) 
    | |- CMakeLists.txt 
    | |- src 
    |- Program2 # depends on Library2 (not directly on Library1) 
    | |- CMakeLists.txt 
     |- src 

Как построить это с помощью CMake 3 в более крупном масштабе (у нас около 20 библиотек)? Мне нужно запросить сборку Program1 и обновить Program1, Library1 и Library2, поскольку они зависят друг от друга. Затем запросить сборку Program2 и не скомпилировать Library1 и Library2. Кроме того, когда я что-то меняю в Library1, все зависимые объекты должны его обнаружить.

ответ

2

Используйте target_link_libraries(Library2 Library1) в Library2/CMakeLists.txt, а затем target_link_libraries(Program1 Library2) в Program1/CMakeLists.txt. Библиотека 1 будет автоматически связана с Program1 из-за зависимости, которую вы описали для Library2. Вам также может понадобиться использовать target_include_directories (см. Пример в нижней части страницы документа) для каждой из ваших библиотек для описания включенных каталогов, которые должны быть «экспортированы», т.е. добавлены в каталоги include для кода, который использует конкретный библиотеки, а не самой библиотеки.

Вы также можете найти полезный пример в нижней части страницы target_link_libraries, описывающей случай, когда библиотеки 1 и Библиотека2 зависят друг от друга и (большинство популярных) линкеров требуют, чтобы одна из этих библиотек была указана дважды в ссылке команды, первый раз перед другой библиотекой и второй раз - после другой библиотеки.

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