【问题标题】:Linker error "unresolved external symbol __imp___iob_func" in libpng.liblibpng.lib 中的链接器错误“未解析的外部符号 __imp___iob_func”
【发布时间】:2012-10-07 15:38:04
【问题描述】:

我正在尝试为 Windows Mobile 6 编译 libpng,但我不断收到以下链接器错误:

error LNK2019: unresolved external symbol __imp___iob_func referenced in function png_default_error libpng.lib
error LNK2019: unresolved external symbol __imp_abort referenced in function png_longjmp

编译是使用 /MD 选项完成的,在我的主项目之间也是如此。 zlib 和 libpng。

改用/MT时,还是有错误,但略有不同:

error LNK2019: unresolved external symbol __iob_func referenced in function png_default_error
error LNK2019: unresolved external symbol abort referenced in function png_longjmp

这带来了几个问题。

  1. 什么是__imp___iob_func__imp_abort
  2. 它们在哪里实施?或者,如何排除对它们的引用?

我的 libpng 编译器选项:

/Od /I "..\lib\zlib-1.2.7" /I "..\lib\lpng1512" /D "_DEBUG" /D "_WIN32_WCE=0x502" /D "UNDER_CE" /D "WIN32_PLATFORM_PSPC" /D "WINCE" /D "DEBUG" /D "_WINDOWS" /D "_USRDLL" /D "LIBPNG_EXPORTS" /D "ARM" /D "_ARM_" /D "_UNICODE" /D "UNICODE" /Gm /EHsc /MDd /fp:fast /GR- /Fo"Windows Mobile 6 Professional SDK (ARMV4I)\Debug/" /Fd"Windows Mobile 6 Professional SDK (ARMV4I)\Debug/vc80.pdb" /W3 /nologo /c /Zi /TC /QMFPE-

图书馆员选项:

/OUT:"Windows Mobile 6 Professional SDK (ARMV4I)\Debug\libpng.lib" /LIBPATH:"C:\Program Files\Windows Mobile 6 SDK\PocketPC\Lib\Armv4i" /NOLOGO /NODEFAULTLIB Coredll.lib /SUBSYSTEM:WINDOWSCE,5.02

我的项目(libpngStreamWrap)编译器选项:

/Od /I "..\lib\lpng1512" /D "_DEBUG" /D "_WIN32_WCE=0x502" /D "UNDER_CE" /D "WIN32_PLATFORM_PSPC" /D "WINCE" /D "DEBUG" /D "_LIB" /D "ARM" /D "_ARM_" /D "_UNICODE" /D "UNICODE" /D "_WINDLL" /Gm /EHsc /MDd /fp:fast /GR- /Yu"stdafx.h" /Fp"Windows Mobile 6 Professional SDK (ARMV4I)\Debug/libpngStreamWrap.pch" /Fo"Windows Mobile 6 Professional SDK (ARMV4I)\Debug/" /Fd"Windows Mobile 6 Professional SDK (ARMV4I)\Debug/vc80.pdb" /W3 /nologo /c /Zi /TP

链接器选项:

/OUT:"Windows Mobile 6 Professional SDK (ARMV4I)\Debug\libpngStreamWrap.dll" /NOLOGO /DLL /MANIFEST:NO /NODEFAULTLIB:"oldnames.lib" /DYNAMICBASE /NXCOMPAT /ERRORREPORT:PROMPT coredll.lib corelibc.lib ole32.lib oleaut32.lib uuid.lib commctrl.lib "..\libpng\windows mobile 6 professional sdk (armv4i)\debug\libpng.lib" "..\zlib\windows mobile 6 professional sdk (armv4i)\debug\zlib.lib"  /SUBSYSTEM:WINDOWSCE,5.02 /VERBOSE:lib

【问题讨论】:

  • 它们是从 C 运行时库的 DLL 版本导入的函数。为它们获取链接器错误将表明 libpng 编译错误。错误的头文件或错误的编译器设置(/MT 与 /MD 选项)。重建 libpng 并确保所有编译器设置与您的主项目匹配。
  • 使用 /MT 和 /MD 选项发布错误。
  • 你能发布你的编译器和链接器命令行吗?

标签: c windows-mobile libpng


【解决方案1】:

最近在 png-mng-implement 列表中已经讨论过这个问题 在 sourceforge.net(主题 libpng Visual Studio 2010 项目):

经过几次长时间的谷歌搜索,结果发现原因是 libpng 调试配置文件“运行时库”设置未设置为 “多线程调试 DLL”作为例外,而是改为“多线程 DLL",它与发布版本中使用的配置文件相同。

这是一个错误。这似乎是手工编辑错误的结果 vcxproj 项目文件 - 如果 RuntimeLibrary 元素被删除或 无效,它被设置为默认值,即 DLL 的 /MD。

它可以在 libpng 1.5 中修复,但这将是一个 API 更改,并且 会破坏现有的、正在运行的 libpng 1.5 项目。因此我 认为最好的事情是添加警告通知(可能在 单独的文件警告)到项目/vstudio 指出问题。 人们一旦知道设置就很容易更改 可能是错误的。

【讨论】:

  • 不过,我正在使用 Visual Studio 2008。无论如何,我最终设法建立了这一切。稍后将发布详细信息。
猜你喜欢
  • 1970-01-01
  • 2014-09-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-30
相关资源
最近更新 更多