与Cmake建立依赖关系

问题描述:

我是CMake的新手,我试图弄清楚如何构建依赖关系。我的项目文件夹是这样组织的:与Cmake建立依赖关系

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

FileIO,CDEs和Utilities是Scrubber中可执行文件使用的静态库。

我希望能够从顶部目录执行一个make命令,它将构建一切。如果我独立构建每个图书馆,那么当我执行顶级制作时,它们会很好地融合在一起。但是如果我不提前这样做,那么它就不会建立依赖关系,并且毫不奇怪地抱怨图书馆没有找到。

所以非常简单的问题:我如何导致系统建立库?

IN SCRUBBER

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 IN SCRUBBER/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 "") 

的CDE CMAKELISTS IN SCRUBBER /的CDE

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 "") 

UTILITIES CMAKELIST IN SCRUBBER/UTILITIES

顶层CMAKELISTS
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在洗涤器/洗涤器

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}) 

这是错误的:

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

的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