Я новичок в 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})
Фактически 'cmake' может автоматически создавать зависимости между целевым уровнем верхнего уровня, если они используются в' target_link_libraries', см. Https://cmake.org/cmake/help/v3.0/ command/target_link_libraries.html – fghj
Я изначально пробовал это, но не мог заставить его работать. Если я добавлю, например, add_dependencies (Scrubber FileIO) в CMake-файл верхнего уровня, то это приведет к ошибкам с «Невозможно добавить зависимости на уровне цели к несуществующей цели». Я помещаю его в неправильное место? – Gadzooks34