![](/img/trans.png)
[英]Use source file from CMake ExternalProject as dependency of target
[英]Target names with CMake ExternalProject for cross platform libraries dependency
我正在嘗試創建一個CMakeLists
,它將自動下載並編譯一個庫, link
其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以給定名稱輸出目標?
為此,通常使用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}")
通過這種方式,它會尋找libzlib.a
Linux和zlib.lib
在Windows上。
但是,您的庫的名稱似乎是非常具體的,並且沒有遵循明顯的命名方案,這使CMake很難自動找到庫(無需對名稱進行硬編碼)。
您可能感興趣的另一種選擇是將ExternalProject_Add
與CMake的管理依賴項功能結合在一起,就像在本項目中所做的那樣,並在本博客文章中進行了介紹 。 如果您采用這種方法,則可以只使用導入項目的CMakeLists.txt
中定義的zlib
目標。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.