9

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...) を実行しますが、どこを見ればよいかわかりません。これは、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...) は失敗します。ビルドしたばかりの libpng ライブラリを探す場所を find_package(PNG...) に知らせる方法がわかりません。たとえば、ブーストの場合、「BOOST_ROOT」変数を設定できます。libpngに似たものはありますか?

敬具、

ダニエル・デッカーズ

4

2 に答える 2

1

BOOST_ROOTの場合のように、find 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_ コマンドを 2 回追加していることに注意してください。初回はデフォルトのディレクトリをスキップします。2 つ目は、デフォルトのディレクトリをスキップしません。最初の検索が成功した場合、2 番目の検索は行われません。PNG_INCLUDE_DIR または PNG_LIBRARY が定義されている場合、2 回目の検索で最初の検索が成功したことがわかります。

于 2011-11-25T18:18:34.263 に答える