【问题标题】:Code::Blocks w/ MinGW: statically link libpng into a dllCode::Blocks w/ MinGW: 将 libpng 静态链接到 dll
【发布时间】:2013-05-15 10:52:47
【问题描述】:

我正在尝试将 libpng16.lib 链接到我的 .dll 文件,但我无法让它工作。我已经将libpng16.libzlib.lib 包含在项目依赖项中(按正确的顺序,首先是libpng),但仍然出现png_* 链接错误。

即使我在谷歌搜索的其他解决方案也不起作用。

编辑:

这是日志:

mingw32-g++.exe -Wall  -O2  -std=c++11 -Wall -g    -c C:\Users\Mark\Documents\CodeBlocks\TextureLoader\TextureLoader.cpp -o obj\Release\TextureLoader.o
C:\Users\Mark\Documents\CodeBlocks\TextureLoader\TextureLoader.cpp: In static member function 'static unsigned int TextureLoader::PNG_Texture_Load(const char*)':
C:\Users\Mark\Documents\CodeBlocks\TextureLoader\TextureLoader.cpp:105:21: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
mingw32-g++.exe -shared  -Wl,--out-implib=bin\Release\libTextureLoader.a -Wl,--dll -LC:\MinGW\include  obj\Release\TextureLoader.o   -o bin\Release\TextureLoader.dll -lOpenGL32 -lGLu32 -s  C:\Users\Mark\Documents\CodeBlocks\TextureLoader\libpng16.lib C:\Users\Mark\Documents\CodeBlocks\TextureLoader\libpng16.lib 
obj\Release\TextureLoader.o: In function `ZN13TextureLoader16PNG_Texture_LoadEPKc':
C:/Users/Mark/Documents/CodeBlocks/TextureLoader/TextureLoader.cpp:27: undefined reference to `png_sig_cmp'
C:/Users/Mark/Documents/CodeBlocks/TextureLoader/TextureLoader.cpp:33: undefined reference to `png_create_read_struct'
C:/Users/Mark/Documents/CodeBlocks/TextureLoader/TextureLoader.cpp:41: undefined reference to `png_create_info_struct'
C:/Users/Mark/Documents/CodeBlocks/TextureLoader/TextureLoader.cpp:50: undefined reference to `png_create_info_struct'
C:/Users/Mark/Documents/CodeBlocks/TextureLoader/TextureLoader.cpp:59: undefined reference to `png_set_longjmp_fn'
C:/Users/Mark/Documents/CodeBlocks/TextureLoader/TextureLoader.cpp:66: undefined reference to `png_init_io'
C:/Users/Mark/Documents/CodeBlocks/TextureLoader/TextureLoader.cpp:68: undefined reference to `png_set_sig_bytes'
C:/Users/Mark/Documents/CodeBlocks/TextureLoader/TextureLoader.cpp:70: undefined reference to `png_read_info'
C:/Users/Mark/Documents/CodeBlocks/TextureLoader/TextureLoader.cpp:77: undefined reference to `png_get_IHDR'
C:/Users/Mark/Documents/CodeBlocks/TextureLoader/TextureLoader.cpp:79: undefined reference to `png_read_update_info'
C:/Users/Mark/Documents/CodeBlocks/TextureLoader/TextureLoader.cpp:81: undefined reference to `png_get_rowbytes'
C:/Users/Mark/Documents/CodeBlocks/TextureLoader/TextureLoader.cpp:109: undefined reference to `png_read_image'
C:/Users/Mark/Documents/CodeBlocks/TextureLoader/TextureLoader.cpp:123: undefined reference to `png_destroy_read_struct'
C:/Users/Mark/Documents/CodeBlocks/TextureLoader/TextureLoader.cpp:100: undefined reference to `png_destroy_read_struct'

【问题讨论】:

  • 您可以发布代码块使用的链接命令+您遇到的错误吗?
  • @greatwolf 请看我的编辑

标签: c++ c++11 mingw codeblocks libpng


【解决方案1】:

链接期间未定义的符号通常表明您尝试链接的导入库有问题,或者工具集正在寻找的内容与导入实际提供的符号之间存在分歧。

话虽如此,mingw自带的gnu ld链接器应该可以看懂msvc.lib导入库。作为替代方案,您可以尝试通过将 libpng16.dll 传递给链接器来直接链接它。

例如,尝试使用以下命令链接:

g++.exe -shared -Wl,--out-implib=bin\Release\libTextureLoader.a -LC:\MinGW\include obj\Release\TextureLoader.o -o bin\Release\TextureLoader.dll -lOpenGL32 - lGLu32 path\location\of\your\libpng16.dll

请注意,您原始链接命令中的-LC:\MinGW\include 可能不正确。直接包含运行时和各种其他导入的库路径通常位于 mingw 的 lib 目录中,而不是包含目录中。例如,mines 位于G:\Mingw32-4.6.3\i686-w64-mingw32\lib

【讨论】:

  • 我尝试用 .dll 替换链接器选项,但它显示“没有这样的文件或目录”。无论如何,我已经通过自己再次重建 libpng16 解决了这个问题,但是让我遇到了另一个错误。 zlib-sgd-x86.dll 不见了。我在互联网上找不到这个 dll。也许我只是在这里搞砸了。
  • 在我的回复中,我假设您正在尝试链接 libpng 的 dll 版本,而不是静态编译的版本。确保传递您的 libpng.dll 实际所在位置的完全限定路径。
猜你喜欢
  • 1970-01-01
  • 2017-08-22
  • 1970-01-01
  • 2014-10-15
  • 2018-04-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多