2014-11-18 5 views
1

У меня есть следующие структуры и реж Lib зависимостей:CMake и зависимости

./lib-a 
./lib-b (depending on lib-a) 

Каждый реж содержит CMakeLists.txt для генерации своего собственного LIB. Я использую политику построения вне исходного кода.

Чтобы сказать, что lib-b зависит от lib-a, я добавил ./lib-b/CMakeLists.txt команду add_subdirectory (../ lib-a lib-a) в соответствии с тем, что учил официальным учебником CMake (http://www.cmake.org/cmake-tutorial/). Таким образом, я получаю, что в директории ./lib-b/build создается подкаталог lib-a.

Это не то поведение, которое я желаю. То, что я хотел бы получить, это CMake, ссылающийся на lib-a при создании lib-b, и если lib-a еще не сгенерирован, CMake должен сгенерировать его внутри ./lib-a/build с помощью CMakeLists.txt из lib-a (в поведении, аналогичном поведению инструмента make при работе с зависимостями).

Я также хотел бы добавить, что я не использую корень CMakeLists.txt в моем примере, но то, что я хотел бы иметь, это lib-b/CMakeLists.txt, объявляющий зависимость от lib-a, что делает lib-a, если он еще не скомпилирован, используя собственный lib-a/CMakeLists.txt.

Вот структура каталоги и их содержимое:

lib-a/ 
    CMakeLists.txt (for compiling lib-a) 
    src/ 
     test.cpp 
    include/ 
     test.hpp 

lib-b/ 
    main.cpp 
    CMakeLists.txt (for compiling lib-b; here is the point where I would like to make reference to lib-a, that I need for the generation of lib-b) 

Lib-б/main.cpp содержит также включать в test.hpp из Lib-а потому, что она использует функцию Lib-а. Это следует учитывать в спецификации lib-b/CMakeLists.txt.

Не могли бы вы предоставить мне два файла lib-a/CMakeLists.txt и lib-b/CMakeLists.txt?

Я надеюсь, что это может прояснить мои потребности

Tnx заранее

D.

ответ

1

Я думаю, что вы неправильно учебник. То, что связывает библиотеки вместе, - target_link_library(lib_b lib_a). Если имя зависимостей является библиотекой, которая является частью сборки, cmake будет магии зависимости для работы. Он не имеет ничего общего с подкаталогами. В самом деле, если бы я иметь следующую структуру каталогов:

./ 
./a.hpp 
./a.cpp 
./b.hpp 
./b.cpp 
./CMakeLists.txt 

Ниже будет установить зависимости просто отлично:

PROJECT(lib_a) 
ADD_LIBRARY(lib_a a.hpp a.cpp) 
PROJECT(lib_b) 
ADD_LIBRARY(lib_b b.hpp b.cpp) 
TARGET_LINK_LIBRARIES(lib_b lib_a) 

Это будет работать по SUBDIR проектов, а также:

./ 
./CMakeLists.txt 
./lib_a/CMakeLists.txt 
./lib_a/a.hpp 
./lib_a/a.cpp 
./lib_b/CMakeLists.txt 
./lib_b/b.hpp 
./lib_b/b.cpp 

И файлы списка:

#./CMakeLists.txt 
CMAKE_MINIMUM_REQUIRED(VERSION 2.8) 
ADD_SUBDIRECTORY(lib_a) 
ADD_SUBDIRECTORY(lib_b) 

#./lib_a/CMakeLists.txt 
CMAKE_MINIMUM_REQUIRED(VERSION 2.8) 
PROJECT(lib_a) 
ADD_LIBRARY(lib_a a.hpp a.cpp) 

#./lib_b/CMakeLists.txt 
CMAKE_MINIMUM_REQUIRED(VERSION 2.8) 
PROJECT(lib_b) 
INCLUDE_DIRECTORIES(${lib_a_SOURCE_DIR}) 
ADD_LIBRARY(lib_b b.hpp b.cpp) 
TARGET_LINK_LIBRARIES(lib_b lib_a) 
+0

Tnx для ваш ответ и предложение использовать target_link_libraries, но приведенный вами пример не соответствует моим потребностям. Действительно, у вас есть все файлы .cpp и .h в одном и том же каталоге, и вы пишете отпечатки в одном CMakeLists.txt в корневом каталоге. На моей стороне вместо этого у меня есть два dirs каждый со своим CMakeLists.txt, как объяснено в исходном сообщении. Не могли бы вы объяснить мне, как ваше предлагаемое решение и использование target_link_libraries могут адаптироваться к моему делу, указав содержимое как lib-a/CMakeLists.txt, так и lib-b/CMakeLists.txt моего дела? – davide

+0

@davide Он отлично подходит для проектов subdir. Обновленный ответ, чтобы отразить это. – IdeaHat

+0

Tnx, а как же включить файлы lib_a? Должен ли я объяснять в lib_b/CMakeLists.txt команду target_include_directories, указывающую на каталог файлов lib_a include? – davide

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