[英]cmake hierarchy zlib, libpng and my own app
我正在嘗試為使用 libpng 的應用程序創建 CMake 層次結構。 Libpng 需要 zlib。
由於 CMakeLists.txt 與 zlib 和 libpng 一起分發,我的第一個想法是制作以下結構:
/development
CMakeLists.txt
/zlib-1.2.5
CMakeLists.txt <- provided by zlib
-sources-
-build of zlib?-
/libpng154
CMakeLists.txt <- provided by libpng
-sources-
-build of libpng?-
/myapp
CMakeLists.txt
-sources-
/build
-build of myapp-
-build of zlib?-
-build of libpng?-
...然后,在頂級 CMakeLists.txt 中,放置如下內容:
project(everything)
...
add_subdirectory(zlib-1.2.5)
add_subdirectory(libpng154)
add_subdirectory(myapp)
...
但沒有運氣。 libpng 的 CMakeLists.txt 執行 find_package(ZLIB...) 但它不知道在哪里查找。 這可能會在 Mac OS 上通過將 zlib“安裝”到 /usr 來解決。 但這在 Windows 中不起作用。
所以我想我不會遞歸到子目錄中。 只需獨立編譯和構建 zlib 和 libpng 並在向下遍歷到我自己的應用程序之前執行 find_package(PNG...)(單獨編譯和構建 zlib 和 libpng(通過提供的 CMakeLists.txt)工作,至少在 Mac OS 上但再次,只是因為 zlib 安裝到 /usr)。
project(everything)
...
find_package(PNG...)
add_subdirectory(myapp)
...
不走運, find_package(PNG...) 失敗。 我不知道如何讓 find_package(PNG...) 知道在哪里尋找我剛剛構建的 libpng 庫。 例如,對於 boost,您可以設置“BOOST_ROOT”變量。 libpng 有什么類似的嗎?
親切的問候,
丹尼爾·德克斯
您必須打開PNG_BUILD_ZLIB
選項以防止 libpng 使用find_package
查找 zlib。
set(PNG_BUILD_ZLIB ON CACHE BOOL "" FORCE)
add_subdirectory(libpng)
# I also had to add some target_include_directories that are
# apparently not set in CMakeLists provided along with zlib and libpng:
target_include_directories(png PUBLIC zlib-1.2.5/ ${CMAKE_CURRENT_BINARY_DIR}/zlib-1.2.5/)
target_include_directories(png PUBLIC libpng154/ ${CMAKE_CURRENT_BINARY_DIR}/libpng154/)
find png 似乎沒有 PNG_ROOT 變量,就像 BOOST_ROOT 的情況一樣。 我懷疑 zlib 庫就是這種情況。 您可以通過查找 find_png 模塊和 find_zlib 模塊來檢查您的模塊目錄。
我會重寫這些模塊並將它們添加到您的 cmake 配置目錄中。 重新編寫的版本應如下所示:
# This module defines
# PNG_INCLUDE_DIR, where to find png.h, etc.
# PNG_FOUND, If false, do not try to use PNG.
# also defined, but not for general use are
# PNG_LIBRARY, where to find the PNG library.
FIND_PATH(
PNG_INCLUDE_DIR png.h
PATHS
${PNG_ROOT}
PATH_SUFFIXES
include
include/libpng
NO_DEFAULT_PATH )
FIND_PATH(
PNG_INCLUDE_DIR png.h
PATHS
${PNG_ROOT}
PATH_SUFFIXES
include
include/libpng )
SET(PNG_NAMES ${PNG_NAMES} png libpng png12 libpng12)
FIND_LIBRARY(
PNG_LIBRARY
NAMES
${PNG_NAMES}
PATHS
${PNG_ROOT}
PATH_SUFFIXES
/lib
NO_DEFAULT_PATHS )
FIND_LIBRARY(
PNG_LIBRARY
NAMES
${PNG_NAMES}
PATHS
${PNG_ROOT}
PATH_SUFFIXES
/lib )
# handle the QUIETLY and REQUIRED arguments and set PNG_FOUND to TRUE if
# all listed variables are TRUE
INCLUDE(FindPackageHandleStandardArgs)
FIND_PACKAGE_HANDLE_STANDARD_ARGS(PNG DEFAULT_MSG PNG_LIBRARY PNG_INCLUDE_DIR)
請注意,我添加了 find_ 命令兩次。 第一次跳過默認目錄。 第二個不跳過默認目錄。 如果第一次搜索成功,則不會進行第二次搜索。 如果定義了 PNG_INCLUDE_DIR 或 PNG_LIBRARY,則第二次搜索將知道第一個搜索成功。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.