【问题标题】:cmake: install header order and dependencies on targetcmake:在目标上安装标头顺序和依赖项
【发布时间】:2015-11-19 19:40:38
【问题描述】:

我有一组库和可执行文件,它们都有自己的 CMakeLists.txt。所有库都将它们的目标构建到相同的路径(例如../build/bin../build/lib)...以及导出它们的头文件(../build/inc)。

现在我希望构建一个构建系统并让 CMake 找出依赖关系(使用 add_subdirectory 和全局构建设置)。

问题是:所有库在构建后都会将其标头导出到build/inc(在调用make install 时)。当我进行整个系统构建时,make install 直到结束后才被调用(并且一切都已构建)。因此,例如带有target_link_libraries( progfoo onelib ) 的可执行文件progfoo 将失败,因为CMake 计算出与onelib 的依赖关系(构建良好),但progfoo 失败,因为它在build/inc 中查找标题...还出口。同样的事情通常适用于许多图书馆。

处理这些情况的正确 CMake-Way 是什么?谢谢!

【问题讨论】:

  • 你应该告诉子项目其他组件的包含在哪里,所以在源目录中。 CMake 必须知道所有库,才能找出构建它们的正确顺序。我不确定是否适合您的布局。
  • 由于@usr1234567 已经很难过,您应该包含原始位置的标题(请参阅我的答案)。如果以后您仍然需要将所有文件放在一个地方,您可以将它们收集起来,这就是 CMake 应该使用的方式。如果你不反对它,它是一个非常有用的工具

标签: cmake


【解决方案1】:

安装是最后一步,应该对用户可见。因此,当您导出二进制文件和标头时,您应该已经在 原始位置 中针对标头构建了二进制文件。

从 CMake 的角度来看,您一次只有 1 个目标。例如,您可以构建一个 Web 服务器并将 libcurlboost::asio 用作依赖项。使用add_subdirectory 将依赖项添加到当前目标是非常可能(并且很好)的,但是当您必须添加包含目录时,您必须基于每个依赖项执行此操作,例如,如果每个依赖项都提供已经是包含当前绝对路径的变量。

在示例中查看这个虚拟 libcurl 的 CMakeLists.txt,它将路径设置为绝对包含目录

get_filename_component(_DIR "${CMAKE_CURRENT_LIST_FILE}" PATH)

// export into parent scope libcurl header location
set (LIBCURL_INCLUDES ${_DIR}/include PARENT_SCOPE) 

然后您可以从 Web 服务器的 CMakeLists.txt 中使用它进行构建,然后再次使用相同的路径来提取文件以便在需要的地方安装它们

add_subdirectory(PATH_TO_LIBCURL_CMAKELISTS)

# add include directories for building web server
include_directories( ${LIBCURL_INCLUDES})

#I assume you are installing headers because final user will need them,
#in case you needed them just for building you are already done here
#without even installing them

#gather headers list
file(GLOB libCurlHeadersList
    "${LIBCURL_INCLUDES}/*.h"
    "${LIBCURL_INCLUDES}/*.hpp"
    )


#install header list
install( FILES
         ${libCurlHeadersList}
         DESTINATION ../build/inc/libcurl
       )

【讨论】:

    猜你喜欢
    • 2016-07-01
    • 2023-04-07
    • 1970-01-01
    • 1970-01-01
    • 2020-03-07
    • 2023-04-10
    • 1970-01-01
    • 1970-01-01
    • 2017-08-17
    相关资源
    最近更新 更多