c - 在 CMake 中链接外部项目的依赖项

标签 c linker dependencies cmake

我的 CMakeLists.txt 中有以下代码:

ExternalProject_Add(
    LibSndFile
    URL "http://www.mega-nerd.com/libsndfile/files/libsndfile-1.0.25.tar.gz"
    CONFIGURE_COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/lib/LibSndFile/configure --prefix=<INSTALL_DIR>
    BUILD_COMMAND ${MAKE}
    SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/lib/LibSndFile
    UPDATE_COMMAND ""
    INSTALL_COMMAND ""
    LOG_DOWNLOAD ON
    LOG_CONFIGURE ON
    LOG_BUILD ON
)

一切都配置和构建得很好,直到项目准备好链接。因为 LibSndFile 依赖于 flaclibogglibvorbis,它需要链接到那些,但它看不到它们。

我怎样才能使我的外部项目可以链接到我系统上安装的那些依赖项(是否有一些我没有看到的 LINK_LIBRARY 选项)?如果它们没有安装在我的系统上,我将如何将它们链接到 LibSndFile?

最佳答案

所以我发现最安全的方法是为 LibSndFile 的依赖项使用另一个 ExternalProject_Add:

find_package(FLAC) # test if FLAC is installed on the system
if(${FLAC_FOUND}) # do something if it is found, maybe tell the user
else(${FLAC_FOUND}) # FLAC isn't installed on the system and needs to be downloaded
    ExternalProject_Add(
        FLAC
        URL "http://downloads.xiph.org/releases/flac/flac-1.3.0.tar.xz"
        CONFIGURE_COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/lib/flac/configure --prefix=<INSTALL_DIR>
        BUILD_COMMAND ${MAKE}
        SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/lib/flac
        UPDATE_COMMAND ""
        INSTALL_COMMAND ""
        LOG_DOWNLOAD ON
        LOG_CONFIGURE ON
        LOG_BUILD ON
    )
endif(${FLAC_FOUND})

然后在 LibSndFile 中使用 DEPENDS 指令将其指向项目所依赖的目标。

ExternalProject_Add(
    LibSndFile
    DEPENDS FLAC libogg libvorbis
    URL "http://www.mega-nerd.com/libsndfile/files/libsndfile-1.0.25.tar.gz"
    CONFIGURE_COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/lib/LibSndFile/configure --prefix=<INSTALL_DIR>
    BUILD_COMMAND ${MAKE}
    SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/lib/LibSndFile
    UPDATE_COMMAND ""
    INSTALL_COMMAND ""
    LOG_DOWNLOAD ON
    LOG_CONFIGURE ON
    LOG_BUILD ON
)

关于c - 在 CMake 中链接外部项目的依赖项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24561016/

相关文章:

python - 无环有向图BFS遍历算法

c++ - C 和 C++ 标准对位级整数表示和操作有什么看法?

c++ - TDateTime 链接错误

c++ - 为什么 dlmalloc 分配的 block 头包含 4 个字节的先前分配的 block

c - 对于这个例子,函数 my_func 是否暴露给链接器?

python - 如何将共享库嵌入到另一个共享库中?

docker - docker多阶段构建期间的Gradle依赖项缓存?

java - 错误 :Execution failed for task ':app:packageAllDebugClassesForMultiDex' . >

c - 通过 Shaker 排序对数组的主对角线进行排序

检查 VirtualAlloc 是否返回了 VirtualAddress