2012-04-04 2 views
12

Допустим, там следующую структуру каталогов:CMake: добавить зависимость не в подкаталоге

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

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

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

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

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

В CMakeFiles.txt тесте по - CMake будет жаловаться «testlib» не находится в подкаталоге «тест» ,

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

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

ответ

14

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

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

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

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

cmake --help-command ADD_SUBDIRECTORY 
+0

спасибо - это именно то, что мне было нужно. – SigTerm

+0

@Fraser - Можно ли указать двоичный каталог в CMakeFile testlib_build? – tower120

+0

@ tower120 - Нет, вам нужно указать его в вызове 'add_subdirectory'. – Fraser

10

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

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

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

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