Подтвердить что ты не робот

Cmake: добавить зависимость не в подкаталог

Скажем, существует следующая структура каталогов:

root
  |
  +--projects
  |      |
  |      +-test
  |         |
  |         +-CMakeFiles.txt
  |
  +--libs
       |
       +-testlib
            |
            +-CMakeFiles.txt

test содержит CMakeFiles.txt, а testlib также содержит CMakeFiles.txt. "test" создает исполняемый файл, а "testlib" создает статическую библиотеку.

Я хочу, чтобы "тест" связывался с "testlib" без использования символических ссылок и без перемещения библиотеки "testlib" в подкаталог в "тесте".

Поскольку "testlib" не является подкаталогом "теста", я не могу сделать

add_subdirectory("../../libs/testlib")

В тесте CMakeFiles.txt - cmake будет жаловаться на то, что "testlib" не находится в подкаталоге "test".

Кроме того, поскольку в системе есть несколько разных компиляторов, я не могу просто установить библиотеки testlib в какой-то центральный каталог, поэтому я хочу, чтобы тест собирал локальную копию testlib и связывался с ней (т.е. как если бы testlib был подкаталог). Я также хочу, чтобы "тестовый" проект автоматически перестраивал "testlib" , если он был изменен.

Итак, как я могу с этим справиться? cmake 2.8.4, winxp sp3.

4b9b3361

Ответ 1

Вы можете либо предоставить CMakeLists.txt верхнего уровня в root, либо предоставить двоичный каталог команде add_subdirectory; например.

add_subdirectory("../../libs/testlib" "${CMAKE_CURRENT_BINARY_DIR}/testlib_build")

Это создает подкаталог под названием testlib_build в вашем текущем каталоге сборки, который содержит сгенерированные файлы проекта для testlib, но не источник.

Для получения дополнительной информации запустите

cmake --help-command ADD_SUBDIRECTORY

Ответ 2

Единственный способ, которым я это вижу, - создать CMakeLists.txt в корне и поставить там следующий код:

add_subdirectory(projects/test)
add_subdirectory(lib/testlib)

Когда вы это сделаете, вы можете сделать target_link_libraries(test testlib) в test/CMakeLists.txt, и он будет автоматически перестроен, если вы что-то измените в testlib.