2011-07-29 12 views
5

मैं libpng का उपयोग करने वाले अनुप्रयोग के लिए एक सीएमके पदानुक्रम बनाने की कोशिश कर रहा हूं। 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 के बाद से दोनों zlib के साथ वितरित किया जाता है और मेरा पहला विचार libpng निम्नलिखित संरचना बनाने के लिए था :

project(everything) 
... 
add_subdirectory(zlib-1.2.5) 
add_subdirectory(libpng154) 
add_subdirectory(myapp) 
... 

लेकिन कोई भाग्य नहीं। Libpng का CMakeLists.txt एक find_package (ZLIB ...) करता है लेकिन यह नहीं जानता कि कहां देखना है। यह मैक ओएस पर "स्थापित" zlib से/usr द्वारा हल किया जा सकता है। लेकिन यह विंडोज़ में काम नहीं करेगा।

तो मैंने सोचा कि मैं उपनिर्देशिका में पुन: सेवा नहीं करूंगा। बस संकलित करें और स्वतंत्र रूप से liblng और libpng का निर्माण करें और अपने स्वयं के ऐप में घुसपैठ करने से पहले एक find_package (PNG ...) करें (कम से कम zlib संकलित और libpng (प्रदान किए गए CMakeLists.txt के माध्यम से) काम करता है, कम से कम मैक ओएस पर लेकिन फिर से, केवल इसलिए क्योंकि zlib/usr पर स्थापित है)।

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

कोई भाग्य नहीं, find_package (PNG ...) विफल रहता है। मुझे नहीं पता कि find_package (पीएनजी ...) को कैसे पता चलेगा कि libpng लाइब्रेरी को अभी कहां देखना है। उदाहरण के लिए बढ़ावा देने के लिए, आप "BOOST_ROOT" चर सेट कर सकते हैं। Libpng के लिए कुछ सिमुलेटर है? के रूप में BOOST_ROOT के साथ मामला है

सधन्यवाद,

डैनियल डेक्कर्स

+0

आमतौर पर, अगर find_package विफल रहता है, तो आप CMakeCache फ़ाइल को संपादित कर सकते हैं और वहां शामिल और लाइब्रेरी पथ दर्ज कर सकते हैं। यदि आप सीएमके के लिए जीयूआई का उपयोग करते हैं तो यह सबसे आसान है। – LiMuBei

उत्तर

0

यह लगता है png की तरह प्रतीत नहीं होता है, PNG_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 परिभाषित किया गया है तो पहला व्यक्ति सफल हुआ है।

संबंधित मुद्दे