3

我正在尝试为 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
4

1 回答 1

5

最近在 sourceforge.net 的 png-mng-implement 列表中讨论了这一点(主题 libpng Visual Studio 2010 项目):

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

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

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

于 2012-10-17T21:44:09.100 回答