CMake find_package 找不到 libpng (16)

CMake find_package can't find libpng (16)

我不是第一个 运行 进入 libpng 问题的人,尤其是当我想 link 在 Windows 上自建资源时。我正在使用来自 https://github.com/glennrp/libpng 的 libpng1638 来源。半官方 - 这个版本的原因是它有一个 CMake build/install 脚本。

zlib enter code here 是 built/found 并且库安装在 c:\Program Files\libpng 中(我为此设置了 CMAKE_INSTALL_PREFIX

执行 find_package(PNG 16) 时出现问题。启用调试标志后,会列出许多搜索目录,但最终无法找到可以 link 安装的路径和文件的 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 中,创建这些 XXX-config.cmake 脚本的部分已被故意禁用用于 Win_32 系统:

  # 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 构建 (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 项目中使用 freetype2 的人,以下是构建依赖项的方法:

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

我对依赖项 BrotliHarfbuzz 做了同样的事情,但到目前为止运气不好。 Harfbuzz 似乎与 freetype2 有一些奇怪的 chicken/egg 关系。

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

-DFT_DISABLE_HARFBUZZ=True 
-DFT_REQUIRE_PNG=True 
-DFT_DISABLE_BROTLI=True 
-DFT_REQUIRE_BZIP2=True 
-DCMAKE_PREFIX_PATH="C:\Program Files\libpng;C:\Program Files\bzip2;C:\Program Files\brotli;C:\Program Files\zlib;C:\Program Files\harfbuzz"

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