【问题标题】:Building dependencies with Cmake使用 Cmake 构建依赖项
【发布时间】:2016-04-21 20:50:04
【问题描述】:

我是 CMake 的新手,我正在尝试弄清楚如何构建依赖项。我的项目文件夹是这样组织的:

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

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

我希望能够从顶层目录执行单个 make 命令来构建所有内容。如果我独立构建每个库,那么当我执行顶级制作时,一切都会很好。但是,如果我不提前这样做,那么它就不会构建依赖项,并且毫不奇怪,会抱怨找不到库。

非常简单的问题:我如何使系统构建库?

洗涤器中的顶级 CMAKELIST

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)

SCRUBBER/FILEIO 中的 FILEIO CMAKELISTS

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

SCRUBBER/CDES 中的 CDES 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/SCRUBBER 中的 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})

【问题讨论】:

    标签: c++ cmake


    【解决方案1】:

    这是错误的:

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

    如果你有库add_library(FileIO STATIC ${SOURCE_FILES}),那么你应该 写:

    target_link_libraries(Scrubber FileIO )
    

    cmake 发现这也是目标,并创建具有适当依赖关系的 make 文件,您不必使用 add_dependency 指向任何依赖关系, cmake 自动完成。至少对我来说是最新的 cmake 版本 3.5

    【讨论】:

      【解决方案2】:

      CMake 包含 add_dependency 命令,可以满足您的需要。

      使顶层依赖于其他顶层目标,以确保它们在构建之前构建。

      【讨论】:

      • 实际上cmake可以自动生成顶级目标之间的依赖关系,如果它们在target_link_libraries中使用,请参见cmake.org/cmake/help/v3.0/command/target_link_libraries.html
      • 我最初尝试过但无法使其工作。例如,如果我将 add_dependencies(Scrubber FileIO) 添加到顶级 CMake 文件,则会出现“无法将目标级别依赖项添加到不存在的目标”的错误。我是不是放错地方了?
      猜你喜欢
      • 2013-04-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-25
      相关资源
      最近更新 更多