【发布时间】:2022-12-29 17:14:14
【问题描述】:
我不是第一个遇到 libpng 问题的人,尤其是当我想链接到 Windows 上的自建资源时。我正在使用来自 https://github.com/glennrp/libpng 的 libpng1638 来源。半官方 - 这个版本的原因是它有一个 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