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
我对依赖项 Brotli
和 Harfbuzz
做了同样的事情,但到目前为止运气不好。 Harfbuzz
似乎与 freetype2 有一些奇怪的 chicken/egg 关系。
为了使用 CMake
为 freetype2
设置构建,构建依赖项后,这些标志起作用:
-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
作为依赖项,因此没有真正需要指定该标志恕我直言,所以我不会碰它。
我不是第一个 运行 进入 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 作为构建目标进行维护。
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
我对依赖项 Brotli
和 Harfbuzz
做了同样的事情,但到目前为止运气不好。 Harfbuzz
似乎与 freetype2 有一些奇怪的 chicken/egg 关系。
为了使用 CMake
为 freetype2
设置构建,构建依赖项后,这些标志起作用:
-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
作为依赖项,因此没有真正需要指定该标志恕我直言,所以我不会碰它。