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

Posted

技术标签:

【中文标题】cmake 层次结构 zlib、libpng 和我自己的应用程序【英文标题】:cmake hierarchy zlib, libpng and my own app 【发布时间】:2011-10-16 00:51:51 【问题描述】:

我正在尝试为使用 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...) 但它不知道在哪里查找。这可以在 Mac OS 上通过“安装”zlib 到 /usr 来解决。但这在 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 有什么类似的吗?

亲切的问候,

丹尼尔·德克斯

【问题讨论】:

通常,如果 find_package 失败,您可以编辑 CMakeCache 文件并在其中输入包含和库路径。如果您使用 CMake 的 GUI,这是最简单的。 【参考方案1】:

您必须打开PNG_BUILD_ZLIB 选项以防止libpng 使用find_package 查找zlib。

set(PNG_BUILD_ZLIB ON CACHE BOOL "" FORCE)
add_subdirectory(libpng)

# I also had to add some target_include_directories that are
# apparently not set in CMakeLists provided along with zlib and libpng:
target_include_directories(png PUBLIC zlib-1.2.5/ $CMAKE_CURRENT_BINARY_DIR/zlib-1.2.5/)
target_include_directories(png PUBLIC libpng154/ $CMAKE_CURRENT_BINARY_DIR/libpng154/)

【讨论】:

【参考方案2】:

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)

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

【讨论】:

以上是关于cmake 层次结构 zlib、libpng 和我自己的应用程序的主要内容,如果未能解决你的问题,请参考以下文章

cmake下载哈希不匹配

与 libpng 和 zlib 链接?

QT+OpenGL(03)--libpng库的编译

Windows下zlib库和libPng库的编译和使用

Windows下zlib库和libPng库的编译和使用

常用开源协议之zlib/libpng License