我正在尝试创建一个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输出具有给定名称的目标?
答案 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
目标。