【问题标题】:How to set include order for cmake如何为 cmake 设置包含顺序
【发布时间】:2019-04-23 10:41:44
【问题描述】:

我正在使用 cmake 为项目生成 Makefile。在顶部的 CMakeLists.txt 中,我需要包含一些子模块。所以它是这样的:

include(cmake/Modules/pcre-8.40.cmake)
include(cmake/Modules/curl-7.64.1.cmake)
include(cmake/Modules/openssl-1.1.1.cmake)

curl-7.64.1.cmake 是这样的:


include(ExternalProject)

set (PCAP_ROOT        ${CMAKE_BINARY_DIR}/third_party/curl)
set (PCAP_LIB_DIR     ${PCAP_ROOT}/lib)
set (PCAP_INCLUDE_DIR ${PCAP_ROOT}/include)
set (OPENSSL_DIR      ${CMAKE_BINARY_DIR}/third_party/openssl/build)
set (OPENSSL_I_DIR  ${OPENSSL_DIR}/include)
set (OPENSSL_L_DIR    ${OPENSSL_DIR}/lib)

set (PCAP_CONFIGURE    cd ${PCAP_ROOT}/src/curl-7.64.1 && cmake -DOPENSSL_ROOT_DIR=${OPENSSL_DIR} -DOPENSSL_INCLUDE_DIR=${OPENSSL_I_DIR} -DOPENSSL_SSL_LIBRARY=${OPENSSL_L_DIR}/libssl.a -DOPENSSL_CRYPTO_LIBRARY=${OPENSSL_L_DIR}/libcrypto.a -DBUILD_SHARED_LIBS=OFF -DBUILD_TESTING=OFF -DCMAKE_INSTALL_PREFIX=${PCAP_ROOT} -DBUILD_CURL_EXE=OFF . -DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE})
set (PCAP_MAKE         cd ${PCAP_ROOT}/src/curl-7.64.1 && make)
set (PCAP_INSTALL      cd ${PCAP_ROOT}/src/curl-7.64.1 && make install)

ExternalProject_Add(curl-7.64.1
        URL         ${CMAKE_SOURCE_DIR}/third_party/curl/curl-7.64.1.zip
        DOWNLOAD_NAME       curl-7.64.1
        PREFIX          ${PCAP_ROOT}
        CONFIGURE_COMMAND   ${PCAP_CONFIGURE}
        BUILD_COMMAND       ${PCAP_MAKE}
        INSTALL_COMMAND     ${PCAP_INSTALL}
        )

include_directories (${CMAKE_BINARY_DIR}/third_party/curl/include)
link_directories (${CMAKE_BINARY_DIR}/third_party/curl/lib)

openssl-1.1.1.cmake:

include(ExternalProject)

set (OPENSSL_ROOT        ${CMAKE_BINARY_DIR}/third_party/openssl)
set (OPENSSL_LIB_DIR     ${OPENSSL_ROOT}/lib)
set (OPENSSL_INCLUDE_DIR ${OPENSSL_ROOT}/include)
set (OPENSSL_INSTALL_DIR ${CMAKE_BINARY_DIR}/third_party/openssl/build)
set (OPENSSL_ROOT_DIR    ${CMAKE_BINARY_DIR}/third_party/openssl)

if (DEFINED CROSS)
    set (OPENSSL_CONFIGURE    cd ${OPENSSL_ROOT}/src/openssl && 
    ./Configure linux-aarch64 no-shared no-asm --prefix=${OPENSSL_INSTALL_DIR} 
    --cross-compile-prefix=${CROSS}- --sysroot=${CMAKE_SYSROOT})  
    set (OPENSSL_MAKE         cd ${OPENSSL_ROOT}/src/openssl && make CC=${CROSS}-gcc AR=${CROSS}-ar  RANLIB=${CROSS}-ranlib)
else()
    set (OPENSSL_CONFIGURE    cd ${OPENSSL_ROOT}/src/openssl && ./config no-shared no-asm --prefix=${OPENSSL_INSTALL_DIR})
    set (OPENSSL_MAKE         cd ${OPENSSL_ROOT}/src/openssl && make)
endif()
set (OPENSSL_INSTALL      cd ${OPENSSL_ROOT}/src/openssl && make install)

ExternalProject_Add(openssl
        URL         ${CMAKE_SOURCE_DIR}/third_party/openssl/openssl-OpenSSL_1_1_1-stable.zip
        DOWNLOAD_NAME       openssl
        PREFIX          ${OPENSSL_ROOT}
        CONFIGURE_COMMAND   ${OPENSSL_CONFIGURE}
        BUILD_COMMAND       ${OPENSSL_MAKE}
        INSTALL_COMMAND     ${OPENSSL_INSTALL}
        )

include_directories (${CMAKE_BINARY_DIR}/third_party/openssl/build/include)
link_directories (${CMAKE_BINARY_DIR}/third_party/openssl/build/lib)

如您所见,curl需要openssl,但我无法控制顺序。所以在不同的计算机中,会发生错误,因为openssl是在curl之后编译的。那么如何确保首先编译 openssl 呢?

【问题讨论】:

  • 请注意,您当前的代码缺少链接:命令link_directories 仅添加一个目录以进行搜索 i> 图书馆名称;您仍然需要target_link_libraries 进行实际链接。实际上,您可以在这里找到从外部项目链接库的示例:stackoverflow.com/a/29324527/3440745
  • 是的,谢谢,实际链接在我没有显示的顶部 CMakeLists.txt 中。我认为这与订单问题无关。
  • 嗯,curl 不是在内部与openssl 链接,在make 内部对curl 的调用?这就是为什么你将-DOPENSSL_ROOT_DIR=${OPENSSL_DIR} 传递给curlcmake。在那种情况下,主项目中的 include_directorieslink_directories 是没有用的:它们根本不会影响 ExternalProject。
  • Curl 无法自动链接 openssl。确实,如果我删除openssl-1.1.1.cmake中的include_directories和link_directories,编译也是成功的。

标签: cmake


【解决方案1】:

ExternalProject_Add 的第一个参数是 目标 的名称,它将为外部项目创建。使用add_dependencies 命令可能会限制构建外部项目的顺序:

# Curl is built *after* the openssl have been built.
add_dependencies(curl-7.64.1 openssl)

【讨论】:

    猜你喜欢
    • 2018-06-05
    • 1970-01-01
    • 2012-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-08
    • 2014-12-05
    相关资源
    最近更新 更多