【问题标题】:AppVeyor c++ cmake PNG package compilation errorAppVeyor c++ cmake PNG包编译报错
【发布时间】:2016-08-27 19:07:27
【问题描述】:

我正在尝试使用 cmake 通过 AppVeyor 为 windows 编译一个跨平台 QT 应用程序。

在 Linux 下 cmake 编译得很好,所以 CMakeLists.txt 应该是有效的。

AppVeyor 编译了一个必要的库,它也可以工作。 但是当涉及到项目 CMakeLists.txt 时,它会失败并出现以下错误:

-- Could NOT find ZLIB (missing:  ZLIB_LIBRARY ZLIB_INCLUDE_DIR) 
CMake Error at C:/Program Files (x86)/CMake/share/cmake-3.5/Modules/FindPackageHandleStandardArgs.cmake:148 (message):
Could NOT find PNG (missing: PNG_LIBRARY PNG_PNG_INCLUDE_DIR)
Call Stack (most recent call first):
C:/Program Files (x86)/CMake/share/cmake-3.5/Modules/FindPackageHandleStandardArgs.cmake:388 (_FPHSA_FAILURE_MESSAGE)
C:/Program Files (x86)/CMake/share/cmake-3.5/Modules/FindPNG.cmake:157 (find_package_handle_standard_args)
CMakeLists.txt:20 (find_package)

CMakeLists.txt里面对应的部分是:

find_package(PNG REQUIRED)

[...some other cmake stuff...]

# link required other libraries
include_directories(${PNG_INCLUDE_DIR} ${GSL_INCLUDE_DIRS})
target_link_libraries(projectName ${PNG_LIBRARY} ${GSL_LIBRARIES})

这是当前的构建失败: https://ci.appveyor.com/project/zebastian/mandelbulber2

使用的 CMakeLists.txt 和 appveyor.yml 文件可以在项目根目录中找到: https://github.com/zebastian/mandelbulber2

由于存在 FindPNG.cmake,似乎只缺少 zlib,这似乎有点奇怪。 我已经看到了一些 appveyor.yml 文件,它们通过下载和编译一些 png / zlib 源文件夹或使用外部依赖项来规避这个问题,但恕我直言,这对于 CI 来说应该是一项简单的任务。

还是我错过了什么?

任何帮助表示赞赏...

【问题讨论】:

  • 清除缓存并重新运行 CMake。如果它输出 PNG 丢失,则 CMake 无法找到它,您必须告诉 CMake 在哪里找到它。
  • 从错误信息看来,CMake既找不到zlib也找不到png。这些库安装在您的 appveyor 构建中的什么位置?请注意,在 WINdows 上,您通常必须将所有库的位置提供给 CMake,而您的构建似乎没有这样做。
  • @usr1234567 谢谢,但如果构建应该在我自己的机器上进行,这将是 TODO。构建 CI AppVeyor 只需要一个描述性 yml 文件,该文件设置一个几乎裸露的 Windows 虚拟机,带有常见的构建程序/包/等。您可以在此处找到描述文件:github.com/zebastian/mandelbulber2/blob/master/.appveyor.yml 如果这个问题可以解决,那就太好了在这个 yml 文件中以一种很好的方式。所以这更像是一个 AppVeyor 的内部问题。 ComicSansMS:是的,这似乎是问题所在。但 FindPNG.cmake 似乎存在。
  • @zebastian FindPng.cmake 应该是 CMake 安装的一部分。但是,这不提供 png,它只能在系统上提供 png 时检测到 png。您仍然需要手动将 png 二进制文件放入您的 Appveyor 环境中。

标签: c++ cmake zlib libpng appveyor


【解决方案1】:

好的,我找到了解决这个特定问题的方法:

在 windows 中有一个名为 nuget 的包管理器来解决这种依赖关系,它也可以很好地与 appveyor 配合使用。要安装 libpng,我使用了以下命令:

#packages from nuget
- nuget install zlib-msvc14-x64-master -Version 1.2.8.4 -Source https://ci.appveyor.com/nuget/zlib-shallow-x0n34b3pfq1b
- ps: move zlib*\* deps -force
- move deps\zlibstatic.lib deps\zlib.lib
- nuget install libpng-msvc14-x64-master -Version 1.6.18.44 -Source https://ci.appveyor.com/nuget/libpng-7hwq4pmmrc48
- ps: move libpng*\* deps -force
- move deps\libpng16_static.lib deps\png.lib

其中 ps 和 move 仅用于移动东西。对我来说,这似乎是一个合理的解决方案,可以让一些人免于繁琐的自我编译。

由于窗口占用并与 4 字母编译指示冲突以及其他 msvc 特定行为,编译仍然失败。但这是另一天的话题......

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-02
    • 1970-01-01
    相关资源
    最近更新 更多