2011-07-29 1 views
5

libake를 사용하는 응용 프로그램에 대한 CMake 계층 구조를 만들려고합니다. Libpng에는 zlib가 필요합니다. 같은 것을 배치, 최상위 CMakeLists.txt에 다음cmake 계층 구조 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 이후

모두 ZLIB와 함께 배포하고 처음 아이디어를 libpng를하면 다음과 같은 구조를 만드는 것이었다됩니다 :

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 ...)를 수행하여 내 응용 프로그램으로 이동합니다. (제공되는 CMakeLists.txt를 통해 zlib 및 libpng 컴파일 및 빌드가 Mac OS에서 작동합니다.) 하지만 zlib가/usr에 설치 되었기 때문에).

project(everything) 
... 
find_package(PNG...) 
add_subdirectory(myapp) 
... 

find_package (PNG ...)가 실패합니다. find_package (PNG ...)가 방금 만든 libpng 라이브러리를 찾을 위치를 어떻게 알 수 있는지 모르겠습니다. 예를 들어 부스트의 경우 "BOOST_ROOT"변수를 설정할 수 있습니다. libpng에 대해 simular가 있습니까? BOOST_ROOT의 경우와 같이

친절 감사를

다니엘 커스

+0

일반적으로 find_package가 실패하면 CMakeCache 파일을 편집하고 거기에 포함 및 라이브러리 경로를 입력 할 수 있습니다. CMake에 GUI를 사용하는 것이 가장 쉽습니다. – LiMuBei

답변

0

그것은 찾을 PNG 아닌 것 같아은 PNG_ROOT 변수가 있습니다. 나는 이것이 zlib 라이브러리의 경우라고 생각한다. find_png 모듈과 find_zlib 모듈을 찾아 모듈 디렉토리를 체크인 할 수 있습니다.

이 모듈을 다시 작성하여 cmake configure 디렉토리에 추가합니다. 다시 쓰여진 버전은 다음과 같아야합니다 :

# 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_command를 두 번 추가합니다. 처음으로 기본 디렉토리를 건너 뜁니다. 두 번째는 기본 디렉토리를 건너 뛰지 않습니다. 첫 번째 검색이 성공하면 두 번째 검색은 수행되지 않습니다. 두 번째 검색은 PNG_INCLUDE_DIR 또는 PNG_LIBRARY가 정의 된 경우 첫 번째 검색이 성공했다는 것을 알 수 있습니다.