2011-07-29 75 views
5

我正在嘗試爲使用libpng的應用程序創建一個CMake層次結構。 Libpng需要zlib。cmake層次結構zlib,libpng和我自己的應用程序

由於的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 ...),但它不知道在哪裏尋找。通過將zlib「安裝」到/ usr,可以在Mac OS上解決這個問題。但這在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相似的嗎?

親切的問候,

丹尼爾·德克斯

+0

通常,如果find_package失敗,您可以編輯CMakeCache文件並在其中輸入include和library路徑。如果您使用CMake的GUI,這是最簡單的。 – LiMuBei

回答

0

它似乎並不像找到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,第二次搜索就會知道第一個搜索會成功。