1

我已经编译了libpng使用 64 位 x86_64-w64-mingw32-gcc 编译器,并libpng使用在 64 位 windows 7 平台上编译的 Visual c++ 编写了一个包装器,并使用以下附加库来构建包装器(即 libpng、libzlib、 libgcc)。当我尝试运行可视化 c++ 包装器时,出现以下错误。请任何人帮我解决这个问题。

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

然后我创建了 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.lib 的可视化 C++ 静态库。并成功创建了静态库 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
4

1 回答 1

0

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

它在 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 运行时不使用这样的帮助程序 - 它依赖于 MSVCRT 运行时提供setjmp支持。显然,VC 运行时中没有mingw_getsp函数。

对于符号,我已安装的 64 位 MinGW 的标头中__strtod()有此提示:stdlib.h

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

因此,您可以__strtod通过在您的一组库中加入链接来解决未解决的外部问题。libmingwex.a看起来它也有助于mingw_getsp解决问题。但也有可能它有自己的一组外部函数,需要一些其他库。

于 2013-04-04T06:25:09.520 回答