【问题标题】:Runtime error when running libpng application运行 libpng 应用程序时出现运行时错误
【发布时间】:2019-12-17 16:08:53
【问题描述】:

我正在尝试编译包含“png.h”头文件的openGL文件,

我收到以下错误:

Open GL version 2.1 ATI-3.2.24
libpng warning: Application built with libpng-1.4.12 but running with 1.6.37
error: png_create_read_struct returned 0.
Failed to read image texture from ../images/ceramic.png

我的 Cmakelists.txt 文件:

cmake_minimum_required (VERSION 3.13)
project (teapot)
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
find_package(OpenGL REQUIRED)
find_package(GLUT REQUIRED)
find_package(PNG REQUIRED)

include_directories(${PNG_INCLUDE_DIR})

add_executable(teapot teapot.cpp)

target_link_libraries(teapot ${OPENGL_gl_LIBRARY}  ${GLUT_LIBRARIES} ${PNG_LIBRARIES} )
set(CMAKE_CXX_FLAGS "-I ${CMAKE_OSX_SYSROOT} ${CMAKE_CXX_FLAGS} -std=c++11")


if (APPLE)
  set (CMAKE_CXX_FLAGS "-Wno-deprecated-declarations ${CMAKE_CXX_FLAGS}")
endif ()

set_target_properties(teapot PROPERTIES
    CXX_STANDARD 11
    CXX_STANDARD_REQUIRED YES
    CXX_EXTENSIONS NO
)

cmake 。工作正常,但是当我执行 ./teapot 时发生上述错误。感谢您的帮助!

【问题讨论】:

  • ../images/ceramic.png 是做什么用的?你确定这个相对路径有效吗?
  • 这是我要读取的 png 文件的路径,我确定它是有效路径
  • 你能检查${PNG_LIBRARIES}的内容吗?我很确定它将包含一个-L 参数,该参数指向一个包含libpng.dylib 的目录,该目录与otool -L teapot 报告的目录不同
  • 你介意我问我如何检查 ${PNG_LIBRARIES} 的内容吗?

标签: c++ cmake


【解决方案1】:

您可能只为libpng-1.4.12 安装了开发库,而没有为libpng-1.6.37 或其他一些“非标准”安装安装。

但消息似乎很清楚,您链接的是旧版本,但在可加载库的运行时路径中有新版本。

find_package(PNG REQUIRED) 只会通过find_library() 搜索“标准”位置。

您可能还想更新您的CMakeLists.txt 文件以使用target_link_libraries( ... PNG::PNG)。这比尝试使用设置的PNG 变量更简单;编译项目时缺少PNG_DEFINITIONS。有关库目标,请参阅 CMake 手册 buildsystem 部分。

您可以使用message() 命令检查变量以打印出它们的值。其中一些也将存储在CMakeCache.txt

如果libpng 不在标准位置,那么您必须使用target_link_libraries( ... /path/to/lib)target_include_directories( ... /path/to/lib/headers) 等来处理它。

【讨论】:

  • 谢谢,/usr/local/lib/libpng.dylib/usr/lib/libz.dylib 这是我收到的消息(${PNG_LIBRARIES})。我试图添加PNG:PNG,但给了我这个:ld: library not found for -lPNG:PNG
  • 我对 MacOS 不熟悉。因此,您正在链接 libpng 和 libz。如果你使用message(PNG_LIBRARIES="${PNG_LIBRARIES}"),输出会更有意义;然后它将显示为要链接的库列表。我的回答中有一个错字,它是PNG::PNG。文档应该澄清它。
  • 似乎在使用PNG::PNG 之后,它仍然给我同样的错误,并且消息给了我这个PNG_LIBRARIES="/usr/local/lib/libpng.dylib/usr/lib/libz.dylib"
  • 你的问题不一定是CMake。问题似乎也与您的libpng 安装有关。我只是还在评论您的 CMake 文件以解决一些其他问题。您需要解决为什么同时安装了 libpng 1.4.12 和 1.6.37。您是否安装了 1.6.37 开发库?它们是否位于 MacOS 的默认位置?如果您没有将它安装在正确的位置,那么您必须按照CMake 的文档说明如何让find_library() 知道您安装它的位置以便它链接到它,如果那是您想要的版本使用。
  • 我去了/usr/local/Cellar/libpng,它只显示一个文件夹为1.6.37,有没有我可以选择构建哪个版本的libpng?
猜你喜欢
  • 2014-11-27
  • 2014-05-14
  • 2018-08-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-18
  • 1970-01-01
相关资源
最近更新 更多