使用CMake ExternalProject定位名称以实现跨平台库依赖性

时间:2017-04-27 19:44:50

标签: c++ compilation cmake cross-platform

我正在尝试创建一个CMakeLists,它会自动下载并编译一个库,并link将它发送到另一个项目,在Windows和Linux上。 为此,我使用ExternalProject_Add。下载和编译部分很好,但是,在windows上创建的库名为zlibd.lib,而在linux上它被称为zlib.a

这是我的代码:

if (NOT Zlib_FOUND)
    message(STATUS "Zlib has not been found. Therefore it will automatically be downloaded during the compilation process.")
    ExternalProject_Add(Zlib
        SOURCE_DIR "${PROJECT_BINARY_DIR}/deps/zlib"
        BINARY_DIR "${PROJECT_BINARY_DIR}/deps/zlib-build"
        INSTALL_DIR "${PROJECT_BINARY_DIR}/deps/zlib-install"
        GIT_REPOSITORY "${git_protocol}://github.com/madler/zlib.git"
        GIT_TAG "50893291621658f355bc5b4d450a8d06a563053d"
        CMAKE_ARGS
            -DCMAKE_INSTALL_PREFIX:PATH=<INSTALL_DIR>
            -DINSTALL_BIN_DIR:PATH=<INSTALL_DIR>/bin
            -DINSTALL_INC_DIR:PATH=<INSTALL_DIR>/include
            -DINSTALL_LIB_DIR:PATH=<INSTALL_DIR>/lib
            -DINSTALL_MAN_DIR:PATH=<INSTALL_DIR>/share/man
            -DINSTALL_PKGCONFIG_DIR:PATH=<INSTALL_DIR>/share/pkgconfig)
    ExternalProject_Get_Property(Zlib install_dir)
    set(ZLIB_LIB_DIR ${install_dir}/lib)
    set(ZLIB_INC_DIR ${install_dir}/include)
    set(ZLIB_BIN_DIR ${install_dir}/bin)

    add_library(zlib STATIC IMPORTED)
    set_target_properties(zlib PROPERTIES IMPORTED_LOCATION ${ZLIB_LIB_DIR}/zlibd.lib)

endif()

但是,这里我硬编码了windows的库名,所以当我想在Linux上编译它时,找不到库。

如何根据平台找到合适的库名称(如果可能的话,不用硬编码)?

谢谢。

编辑:是否可以从ExternalProject获取目标? (使用getproperty或类似的东西?)或者最终以另一种方式执行此操作,强制ExternalProject输出具有给定名称的目标?

1 个答案:

答案 0 :(得分:0)

为此,您通常会使用find_library

find_library(ZLIB_LIBRARY NAMES foo PATHS ${ZLIB_LIB_DIR})
add_library(zlib STATIC IMPORTED)
set_target_properties(zlib PROPERTIES IMPORTED_LOCATION "${ZLIB_LIBRARY}")

这样,它会在Linux上查找libzlib.a,在Windows上查找zlib.lib

然而,您的库的名称似乎非常具体,并且没有遵循明显的命名方案,这使得CMake很难自动找到库(没有对名称进行硬编码)。

您可能感兴趣的另一个选项是将ExternalProject_Add与CMake管理依赖关系的能力结合起来,如this project中所述,并在this blog article中进行了描述。如果您遵循此方法,则只需使用您导入的项目的zlib中定义的CMakeLists.txt目标。