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

问题描述 投票:6回答:2

我正在尝试为使用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 ...),然后再遍历到我自己的应用中(至少(在Mac OS上有效,但仅由于将zlib安装到/ usr中,)(分别通过提供的CMakeLists.txt编译和构建zlib和libpng才有效)。

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

没有运气,find_package(PNG ...)失败。我不知道如何让find_package(PNG ...)知道在哪里寻找我刚刚构建的libpng库。例如,对于增强,可以设置“ BOOST_ROOT”变量。 libpng有什么相似之处吗?

亲切的问候,

Daniel Dekkers

c++ cmake zlib libpng
2个回答
1
投票

似乎find png不具有PNG_ROOT变量,就像BOOST_ROOT那样。我怀疑zlib库就是这种情况。您可以通过查找find_png模块和find_zlib模块来检入modules目录。

我将重写这些模块,并将它们添加到您的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_命令。第一次跳过默认目录。第二个不跳过默认目录。如果第一个搜索成功,则第二个不成功。如果定义了PNG_INCLUDE_DIR或PNG_LIBRARY,则第二次搜索将知道第一个成功。


0
投票

您必须打开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/)
© www.soinside.com 2019 - 2024. All rights reserved.