【问题标题】:CMake find_package can't find libpng (16)CMake find_package 找不到libpng (16)
【发布时间】:2022-12-29 17:14:14
【问题描述】:

我不是第一个遇到 libpng 问题的人,尤其是当我想链接到 Windows 上的自建资源时。我正在使用来自 https://github.com/glennrp/libpnglibpng1638 来源。半官方 - 这个版本的原因是它有一个 CMake 构建/安装脚本。

zlib 已构建/找到,库安装在c:\Program Files\libpng(我为此设置了CMAKE_INSTALL_PREFIX

执行 find_package(PNG 16) 时会出现问题。启用调试标志后,会列出许多搜索目录,但最终无法找到可以链接到已安装路径和文件的 PNG-config.cmake 脚本。

当我将CMAKE_PREFIX_PATH 设置到正确的文件夹时似乎没有帮助,原因在下面解释。

这是我在脚本中使用的命令(zlib 已经找到):

set(CMAKE_FIND_DEBUG_MODE TRUE)
find_package(PNG 16         PATHS "C:\\Program Files\\libpng\\lib\\libpng")
set(CMAKE_FIND_DEBUG_MODE FALSE)

这是调试跟踪的输出:

...
find_package considered the following locations for the Config module:
  ...
  C:/Program Files/CMake/PNGConfig.cmake
  C:/Program Files/CMake/png-config.cmake
  C:/Program Files (x86)/PNGConfig.cmake
  C:/Program Files (x86)/png-config.cmake
  C:/Program Files/libpng/lib/libpng/PNGConfig.cmake
  C:/Program Files/libpng/lib/libpng/png-config.cmake

实际上,在我的系统上的任何地方都找不到png-config.cmake 文件。在libpng 的源代码CMakeLists.txt 中,为Win_32 系统故意禁用了创建这些XXX-config.cmake 脚本的部分:

  # Install the pkg-config files.
  if(NOT CMAKE_HOST_WIN32 OR CYGWIN OR MINGW)
    install(FILES ${CMAKE_CURRENT_BINARY_DIR}/libpng.pc
            DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig)
    install(PROGRAMS ${CMAKE_CURRENT_BINARY_DIR}/libpng-config
            DESTINATION ${CMAKE_INSTALL_BINDIR})
    install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${PNGLIB_NAME}.pc
            DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig)
    install(PROGRAMS ${CMAKE_CURRENT_BINARY_DIR}/${PNGLIB_NAME}-config
            DESTINATION ${CMAKE_INSTALL_BINDIR})
  endif()

由于我不想涉足源文件(最终直接从网络上提取),所以我想了解一下。为什么本机 Win32 版本会禁用此功能? (大多数在线信息使用 Linux 子系统或包管理器..)

zlib 等其他软件包将其 XXX-config.cmake 文件正确复制到安装文件夹,FindXXX.cmake 脚本可以在其中正确获取它们。

为了完整起见,这里是 libpng build (msvc) 的输出

  -- Install configuration: "Debug"
  -- Installing: C:/Program Files/libpng/lib/libpng16d.lib
  -- Installing: C:/Program Files/libpng/bin/libpng16d.dll
  -- Installing: C:/Program Files/libpng/lib/libpng16_staticd.lib
  -- Installing: C:/Program Files/libpng/include/png.h
  -- Installing: C:/Program Files/libpng/include/pngconf.h
  -- Installing: C:/Program Files/libpng/include/pnglibconf.h
  -- Installing: C:/Program Files/libpng/include/libpng16/png.h
  -- Installing: C:/Program Files/libpng/include/libpng16/pngconf.h
  -- Installing: C:/Program Files/libpng/include/libpng16/pnglibconf.h
  -- Installing: C:/Program Files/libpng/bin/pngfix.exe
  -- Installing: C:/Program Files/libpng/bin/png-fix-itxt.exe
  -- Installing: C:/Program Files/libpng/share/man/man3/libpng.3
  -- Installing: C:/Program Files/libpng/share/man/man3/libpngpf.3
  -- Installing: C:/Program Files/libpng/share/man/man5/png.5
  -- Installing: C:/Program Files/libpng/lib/libpng/libpng16.cmake
  -- Installing: C:/Program Files/libpng/lib/libpng/libpng16-debug.cmake

非常感谢所有见解!

更新 1

在摆弄安装命令之后,我不得不得出结论,https://github.com/glennrp/libpng 中的 libpng-libpng16.zip 并没有将 Windows 作为构建目标来维护。

来自https://sourceforge.net/projects/libpng/lpng1637.zip 有同样的问题。

更新 2:

到目前为止,我已经尝试设置PNG_DIR、设置CMAKE_PREFIX_PATH 和其他一些失败的事情。只有一个似乎有效,即将环境 PNG_ROOT 变量设置为正确的安装文件夹。这太丑陋了,但它似乎是唯一可行的选择。

【问题讨论】:

    标签: windows cmake msbuild libpng


    【解决方案1】:

    因此,对于像我一样试图在 Windows 项目中使用 freetype2 的人,以下是构建依赖项的方法:

    • 确保您的zlib 已构建并安装在C:Program FilesZlib 文件夹中
    • 通常可以毫无问题地找到zlib。可以肯定的是,请删除所有其他事件,尤其是 C:Program Files (x86) 下的那些事件(如果有的话)。这将确保find_package(..) 不会混淆不同的目标。使用-DCMAKE_INSTALL_PREFIX 强制构建/安装到该目录。
    • 设置环境PNG_ROOT环境变量为C:Program Fileslibpng
    • 设置环境 BZIP2_ROOT 环境变量为C:Program Fileszip2
    • 设置环境ZLIB_ROOT环境变量为C:Program Fileszlib

    我对依赖关系 BrotliHarfbuzz 做了同样的事情,但到目前为止运气不好。 Harfbuzz 似乎与 freetype2 有某种奇怪的先有鸡还是先有蛋的关系。

    为了使用 CMakefreetype2 设置构建,在构建依赖项之后,这些标志起作用:

    -DFT_DISABLE_HARFBUZZ=True 
    -DFT_REQUIRE_PNG=True 
    -DFT_DISABLE_BROTLI=True 
    -DFT_REQUIRE_BZIP2=True 
    -DCMAKE_PREFIX_PATH="C:Program Fileslibpng;C:Program Fileszip2;C:Program Filesrotli;C:Program Fileszlib;C:Program Filesharfbuzz"
    

    请注意,libpng 引入了 zlib 作为依赖项,因此没有真正需要指定该标志恕我直言,所以我没有碰它。

    【讨论】:

      猜你喜欢
      • 2016-01-19
      • 2018-02-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多