2013-04-03 2 views
1

Я скомпилировал libpng с использованием 64-битного x86_64-w64-mingw32-gcc-компилятора, и я написал обертку для этого libpng с использованием visual C++, скомпилированного в 64-битной платформе Windows 7 и использую следующую дополнительную библиотеку для создайте оболочку (например, libpng, libzlib, libgcc). Пока я пытаюсь запустить визуальную оболочку 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 битных окон 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 

с помощью следующей библиотеки я попытаюсь создать Visual C++ статическую библиотеку с именем LSpng.lib. и успешно создал статическую библиотеку LSpng. Я получил следующую ошибку при запуске LSpng.lib в 64-битной машине Windows.

“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' –

ответ

0

Объектные файлы вы собираете с MinGW-64 предполагается, что они будут поддержаны (связаны) библиотеки времени выполнения MinGW. При связывании объектных файлов C, построенных с одним компилятором, может работать случайность, связанная с другой средой компилятора (что, похоже, происходит с вами с 32-битными сборками), это не то, что будет работать в общем случае.

Он будет работать большую часть времени для MinGW, потому что он полагается на системную DLL MSVCRT.DLL для Windows на протяжении большей части своей поддержки во время выполнения, но не на 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.

Для __strtod() символа есть это намек на stdlib.h заголовка в 64-битном MinGW я установил:

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

Так что вы можете быть в состоянии работать вокруг __strtod неразрешенный внешний, включив libmingwex.a в ваш набор библиотек для связи. Похоже, что это также поможет с проблемой mingw_getsp. Но есть шанс, что у него может быть свой собственный набор экстернов, для которого требуется другая библиотека.

+0

пока я включаю libmingwex.a, тогда я получу следующие ошибки. "Ошибка ошибка LNK2005: longjmp уже определены в LSpng.lib (lib64_libmingwex_a-mingw_getsp.o) \t MSVCRTD.lib" "Ошибка \t \t 2 Ошибка LNK2019: неразрешенный внешний символ __mingw_raise_matherr ссылка в функции мощн \t LSpng.lib " " ошибка фатальным LNK1120 ошибки: 1 неразрешенных внешних \t E: \ Siva \ v1.0.0.4 \ Rel_4.1.0 \ LSpng \ x64 \ Debug \ Testpng.exe " – Siva

+0

@Siva: Я не очень удивлен. Как я уже сказал, вы действительно ступаете в неподдерживаемую область, пытаясь связать объекты одного компилятора с исполняемой средой другого компилятора. –

+0

@MichaelBurrr, то как я могу решить проблему. – Siva

Смежные вопросы