2016-04-21 3 views
0

Я новичок в CMake, и я пытаюсь выяснить, как строить зависимости. Мои папки проекта организованы следующим образом:Построение зависимостей с Cmake

Scrubber 
-- FileIO 
-- CDEs 
-- Utilities 
-- Scrubber 

FileIO, CDEs и утилиты статические библиотеки, которые используются исполняемому в скруббер.

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

Очень простой вопрос: как я могу заставить систему создавать библиотеки?

CMAKELISTS верхнего уровня в сепараторе

cmake_minimum_required(VERSION 3.2) 
project(Scrubber) 

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11") 

add_subdirectory(FileIO) 
add_subdirectory(CDEs) 
add_subdirectory(Utilities) 
add_subdirectory(Scrubber) 

FileIO CMAKELISTS В скруббере/FileIO

cmake_minimum_required(VERSION 3.2) 
project(FileIO) 

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11") 

file(GLOB SOURCE_FILES *.cpp) 

add_library(FileIO STATIC ${SOURCE_FILES}) 

#Don't prepend with "lib" 
set_target_properties(FileIO PROPERTIES PREFIX "") 

т.т. CMAKELISTS В скруббере/т.т.

cmake_minimum_required(VERSION 3.2) 
project(CDEs) 

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11") 

set(BOOST_INCLUDE_DIR "/usr/lib/boost_1_60_0") 

include_directories(${BOOST_INCLUDE_DIR}) 

file(GLOB SOURCE_FILES *.cpp) 

add_library(CDEs STATIC ${SOURCE_FILES}) 

#Don't prepend with "lib" 
set_target_properties(CDEs PROPERTIES PREFIX "") 

УТИЛИТ CMAKELIST В скруббере/Утилиты

cmake_minimum_required(VERSION 3.2) 
project(Utilities) 

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11") 

set(BOOST_INCLUDE_DIR "/usr/lib/boost_1_60_0") 

include_directories(${BOOST_INCLUDE_DIR}) 

file(GLOB SOURCE_FILES *.cpp) 

add_library(Utilities STATIC ${SOURCE_FILES}) 

#Don't prepend with "lib" 
set_target_properties(Utilities PROPERTIES PREFIX "") 

SCRUBBER CMAKELIST В SCRUBBER/SCRUBBER

cmake_minimum_required(VERSION 3.2) 
project(Scrubber) 

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11") 

set(BOOST_INCLUDE_DIR "/usr/lib/boost_1_60_0") 
set(PROJECT_INCLUDE_DIR "..") 

include_directories(${BOOST_INCLUDE_DIR} ${PROJECT_INCLUDE_DIR}) 

find_library(FILEIO_LIB FileIO.a HINTS ../FileIO/) 
find_library(CDES_LIB CDEs.a HINTS ../CDEs/) 
find_library(UTILITIES_LIB Utilities.a HINTS ../Utilities/) 

file(GLOB SOURCE_FILES *.cpp) 

add_executable(Scrubber ${SOURCE_FILES}) 

target_link_libraries(Scrubber ${FILEIO_LIB} ${CDES_LIB} ${UTILITIES_LIB}) 

ответ

0

Это неправильно:

target_link_libraries(Scrubber ${FILEIO_LIB} ${CDES_LIB} ${UTILITIES_LIB}) 

, если у вас есть библиотека add_library(FileIO STATIC ${SOURCE_FILES}), то вы должны написать:

target_link_libraries(Scrubber FileIO) 

CMake узнать, что это также цель, и создать сделать файл с правильные зависимости, и вам не нужно указывать какие-либо зависимости с помощью add_dependency, cmake сделать это автоматически. По крайней мере, текущий для меня cmake версия 3.5

0

CMake включает add_dependency команду, которая делает именно то, что вам нужно.

Сделать верхний уровень зависеть от других целей верхнего уровня, чтобы обеспечить их сборку до этого.

+0

Фактически 'cmake' может автоматически создавать зависимости между целевым уровнем верхнего уровня, если они используются в' target_link_libraries', см. Https://cmake.org/cmake/help/v3.0/ command/target_link_libraries.html – fghj

+0

Я изначально пробовал это, но не мог заставить его работать. Если я добавлю, например, add_dependencies (Scrubber FileIO) в CMake-файл верхнего уровня, то это приведет к ошибкам с «Невозможно добавить зависимости на уровне цели к несуществующей цели». Я помещаю его в неправильное место? – Gadzooks34

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