簡體   English   中英

cmake 層次結構 zlib、libpng 和我自己的應用程序

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM