与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
顶层CMAKELISTScmake_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'可以自动生成顶层目标之间的依赖关系,如果它们用在'target_link_libraries'中,请参阅https://cmake.org/cmake/help/v3.0/ command/target_link_libraries.html – fghj
我最初尝试过,但无法使其工作。例如,如果我将add_dependencies(Scrubber FileIO)添加到顶级CMake文件,那么它会出现“无法将目标级别依赖关系添加到不存在的目标”的错误。我把它放在错误的地方? – Gadzooks34