cmake层次结构zlib,libpng和我自己的应用程序

Dan*_*ers 6 c++ zlib cmake libpng

我正在尝试为使用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?-
Run Code Online (Sandbox Code Playgroud)

...然后,在顶级CMakeLists.txt中,放置如下内容:

project(everything)
...
add_subdirectory(zlib-1.2.5)
add_subdirectory(libpng154)
add_subdirectory(myapp)
...
Run Code Online (Sandbox Code Playgroud)

但没有运气.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)
...
Run Code Online (Sandbox Code Playgroud)

没有运气,find_package(PNG ...)失败了.我不知道如何让find_package(PNG ...)知道在哪里寻找我刚建立的libpng库.例如,对于boost,您可以设置"BOOST_ROOT"变量.libpng有什么类似的吗?

亲切的问候,

丹尼尔德克斯

Kli*_*Joe 1

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)
Run Code Online (Sandbox Code Playgroud)

请注意,我添加了两次 find_ 命令。第一次跳过默认目录。第二个不跳过默认目录。如果第一次搜索成功,则第二次搜索不会完成。如果定义了 PNG_INCLUDE_DIR 或 PNG_LIBRARY,则第二次搜索将知道第一个搜索成功。