2013-04-03 293 views
1

我已经使用64位x86_64-w64-mingw32-gcc编译器编译了libpng,并且我已经使用在64位Windows 7平台中编译的visual C++编写了该包的libpng,并使用以下附加库构建包装(即libpng,libzlib,libgcc)。在尝试运行visual C++包装器时出现以下错误。请任何人帮我解决这个问题。无法解析的外部符号mingw_getsp

unresolved external symbol mingw_getsp referenced in function read_png. 
unresolved external symbol __strtod refernced in function png_handle_sCAL 

我的包括文件是这样的

#ifdef __cplusplus 
extern "C" { 
#endif /* __cplusplus */ 

#define PNG_BYTES_TO_CHECK 4 

#define OK 0 
#define UNSUP_IMG_FMT -1 
#define ERROR_FILE_READ -2 
#define ERROR_CREATE_PNG_STRUCT -3 
#define ERROR_CREATE_INFO_STRUCT -4 
#define ERROR_SET_JMP -5 
#define UNSUP_DEPTH -6 
#define UNSUP_COLOR -7 
#define UNSUP_INTRLC -8 
#define UNSUP_HEIGHT_WIDTH -9 

struct fakefile 
{ 
    unsigned char *ptr; 
    size_t lim; 
}; 
int check_if_png(char*); 
int check_if_pngbuffer(unsigned char *); 
int read_png(char*,int*,int*,unsigned char**); 
int read_pngbuffer(unsigned char*,int ,int*,int*,unsigned char **); 
int write_png(char*,int,int,unsigned char*,int); 
int write_pngbuffer(unsigned char**,int*,int,int,unsigned char*,int); 


#ifdef __cplusplus 
} 
#endif /* __cplusplus */ 

一件事我已经为32位Windows XP能够正常工作

首先我编译zlib的,创造了libzlib这样做。 lib

x86_64-w64-mingw32-gcc -c *.c 
x86_64-w64-mingw32-ar rcs libzlib.lib *.o 
del *.o 

然后我像这样创建了libpng

x86_64-w64-mingw32-gcc -I ../zlib -c *.c 
x86_64-w64-mingw32-ar rcs libpng.lib *.o 
del *.o 

然后我用下面的图书馆中,我将尝试创建一个Visual C++静态库命名LSpng.lib创建pngreadwrite.c & pngreadwrite.h包装libpngrw.lib

x86_64-w64-mingw32-gcc -I ../zlib -c pngreadwrite.c 
x86_64-w64-mingw32-ar rcs libpngrw.lib *.o 
del *.o 

。并成功创建了静态库LSpng。我在64位Windows机器上运行LSpng.lib时出现以下错误。

“error LNK2019: unresolved external symbol mingw_getsp referenced in function read_png” 
“error LNK2001: unresolved external symbol mingw_getsp” 
“error LNK2001: unresolved external symbol mingw_getsp” 
“error LNK2019: unresolved external symbol __strtod referenced in function png_handle_sCAL” 

LSpng.lib(pngreadwrite.o) : error LNK2001: unresolved external symbol mingw_getsp referenced in function read_png 
LSpng.lib(pngread.o) : error LNK2001: unresolved external symbol mingw_getsp 
LSpng.lib(pngread.o) : error LNK2001: unresolved external symbol mingw_getsp 
LSpng.lib(pngrutil.o) : error LNK2019: unresolved external symbol __strtod referenced in function png_handle_sCAL 
+0

你忘记包含一些库吗? –

+0

@ bash.d我包含libgcc库。如果有任何其他库需要加载 – Siva

+0

请显示您的'#include's –

回答

0

您用MinGW-64编译的目标文件假定它们将被(链接到)MinGW运行时库支持。当链接到另一个编译器的运行时(这似乎在32位版本中发生的情况)链接使用一个编译器构建的C对象文件时,可能会发生偶然事件,但这不适用于一般情况。

对于MinGW来说,它大部分时间都会工作,因为它依赖Windows系统DLL MSVCRT.DLL的大部分运行时支持 - 但不是100%。

为了您的64位打造您有:

  • libpng功能png_handle_sCAL()(从pngrutil.c)要链接到__strtod。但是,VC函数库中该函数的符号是​​未修饰的strtod。作为一个方面说明 - 看着来源我看不到png_handle_sCAL()打电话给strtod()。也许你有我下载的不同版本的库。
  • read_png函数(我假设在pngreadwrite.c)想链接到mingw_getsp - MinGW库用于帮助实现setjmp(以及其他的东西)的函数。 32位MinGW运行时不使用这样的帮助程序 - 它依赖于支持setjmp的MSVCRT运行时。显然,VC运行时没有mingw_getsp函数。

对于__strtod()符号有这个提示在64位的MinGW一个stdlib.h头我已经安装:

/* libmingwex.a provides a c99-compliant strtod() exported as __strtod() */ 

所以,你可能能够通过包括libmingwex.a在解决该__strtod无法解析的外部你的链接集库。它看起来像它也将帮助mingw_getsp问题。但也有可能会有自己的一套extern需要其他库。

+0

虽然我包含libmingwex.a然后我会得到以下错误。 “错误\t \t 1错误LNK2005:longjmp的在LSpng.lib(lib64_libmingwex_a-mingw_getsp.o)\t MSVCRTD.LIB已经定义” “错误\t \t 2错误LNK2019:在功能POW引用\t LSpng.lib 解析外部符号__mingw_raise_matherr”“ 错误致命错误LNK1120:1周无法解析的外部\t E:\西瓦\ V1.0.0.4 \ Rel_4.1.0 \ LSpng \ 64 \调试\ Testpng.exe “ – Siva

+0

@Siva:我不是真的很惊讶。就像我所说的,当你尝试将一个编译器的对象与另一个编译器的运行时连接起来时,你确实正在踩入一个不受支持的区域。 –

+0

@MichaelBurrr然后我该如何解决这个问题.. – Siva