【问题标题】:How to build and link external CMake dependencies with CMake?如何使用 CMake 构建和链接外部 CMake 依赖项?
【发布时间】:2019-10-03 17:37:34
【问题描述】:

我想使用以下第三方库: https://github.com/Corvusoft/restbed

我想创建一个类似这样的文件夹结构:

- root
     - CMakeLists.txt
     - src
     - third_party
         - restbed
             - src
             - CMakeLists.txt
         - CMakeLists.txt

我发现我应该使用ExternalProject CMake 模块来实现这一点,但似乎我不能正确地做到这一点。由于某种原因,当我使用根 CMakeLists.txt 生成外部库(restbed)源时,它不会出现在我的 XCode 项目中。此根 CMakeLists.txt 包含在 third_party 文件夹的 CMakeLists.txt 中。 third_party 文件夹的 CMakeLists.txt 如下所示:

include(ExternalProject)

# CMAKE_CURRENT_LIST_DIR -> third_party folder
set(RESTBED_DIR ${CMAKE_CURRENT_LIST_DIR}/restbed)

ExternalProject_Add(restbed
    PREFIX ${RESTBED_DIR}
    SOURCE_DIR ${RESTBED_DIR}
    CMAKE_ARGS -DBUILD_SSL=NO
    DOWNLOAD_COMMAND ""
    UPDATE_COMMAND ""
    BUILD_COMMAND cmake ..
    BINARY_DIR ${RESTBED_DIR}/build
    INSTALL_DIR ${RESTBED_DIR}/distribution
    INSTALL_COMMAND make install
)

set(RESTBED_INCLUDE_DIR ${RESTBED_DIR}/distribution/include)
set(RESTBED_LIB_DIR ${RESTBED_DIR}/distribution/lib)

add_library(librestbed IMPORTED STATIC)
add_dependencies(librestbed restbed)

在此之后,我想使用 target_include_dirtarget_link_librarieslibrestbed 添加为我的根项目的依赖项。在此之后,当我构建我的 XCode 项目时,没有任何反应,外部库将不会被构建。我究竟做错了什么?我不想使用内置的 CMake git 功能,因为我想将我的外部依赖项作为 git 子模块存储在第三方库中。我宁愿不让 CMake 弄清楚它是否需要重新下载给定的依赖项。提前致谢!

【问题讨论】:

  • 我认为你需要的cmake命令是'add_subdirectory'
  • 我认为这是不同的,因为它将它作为我项目的一部分而不是外部项目添加

标签: c++ cmake restbed


【解决方案1】:

我认为您将BUILD_COMMAND 选项与CONFIGURE_COMMAND 选项混淆了。 cmake .. 应该放在选项 CONFIGURE_COMMAND 之后。

ExternalProject_Add(restbed
    PREFIX ${RESTBED_DIR}
    SOURCE_DIR ${RESTBED_DIR}
    CMAKE_ARGS -DBUILD_SSL=NO
    DOWNLOAD_COMMAND ""
    UPDATE_COMMAND ""
    CONFIGURE_COMMAND cmake ..
    BINARY_DIR ${RESTBED_DIR}/build
    INSTALL_DIR ${RESTBED_DIR}/distribution
    INSTALL_COMMAND make install
)

根据documentation,每个命令都有默认值,因此您可能根本不需要指定CONFIGURE_COMMAND。例如,对于BUILD_COMMAND

如果未给出此选项,将选择默认构建命令以最合适的方式与主构建集成(例如,对于 Makefile 生成器使用递归 make,如果项目使用 CMake 构建,则使用 cmake --build) .

此外,如果您确实指定了 CONFIGURE_COMMAND,您可能会将传递给它的参数扩展为如下内容:

    ...
    CONFIGURE_COMMAND cd restbed && mkdir build && cd build && cmake ..
    ...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-23
    • 1970-01-01
    • 1970-01-01
    • 2021-08-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多