Привет, я пытаюсь скомпилировать файл src, связав внешнюю библиотеку.
Получение ошибки ниже
неопределенная ссылка на `__isoc99_sscanf@GLIBC_2.7 '
make -f GNUmakefile
g++ -m32 -D_POSIX_PTHREAD_SEMANTICS -g -Wl,--version-script=fix.txt -D_GNU_SOURCE -I../include ConnectionAndAuthExample.cpp -o ../Linux/ConnectionAndAuthExample_32 -L../Linux -lsomelib
../Linux/libsomelib.so: undefined reference to `__isoc99_sscanf@GLIBC_2.7'
Содержимое fix.txt
GLIBC_2.7 {
global: *;
local: *;
};
На аналогичный запрос был дан ответ ниже. здесь не помогает. Я хочу знать, сталкивался ли кто-нибудь еще с подобной ошибкой и устранял ли ее.
Моя версия GCC
-bash-3.2$ g++ --version
g++ (GCC) 4.1.2 20080704 (Red Hat 4.1.2-50)
Наконец, ссылка в вопросе поможет с небольшими изменениями из других ответов. Вот мое исправление.
Я создал новый файл cpp со следующим содержимым
#include <iostream>
#include <stdarg.h>
__asm__(".symver __isoc99_sscanf,__isoc99_sscanf@GLIBC_2.7");
#ifdef __cplusplus
extern "C" {
#endif
int __isoc99_sscanf(const char *a, const char *b, va_list args)
{
int i;
va_list ap;
va_copy(ap,args);
i=sscanf(a,b,ap);
va_end(ap);
return i;
}
#ifdef __cplusplus
}
#endif
Скомпилировал его, чтобы получить объектный файл, и использовал его вместе с fix.txt, упомянутым в вопросе.
Однако я хотел бы сообщить, что, поскольку моя сторонняя библиотека была скомпилирована на более поздней версии. Я получаю ELF файл OS ABI недействителен, когда запускаю свой двоичный файл.
Решение из другого ответа, в котором предлагается использовать patchelf и изменить раздел intert, не помогает, поскольку общие файлы в основном не имеют этого раздела.
Я также пытался скомпилировать glibc2.7 и собрать свой двоичный файл, используя
-Wl,--dynamic-linker
-Wl,--rpath
флаги, указывающие на glibc2.7. Все равно зря.