Я пытаюсь создать программу против wxWidgets, и я получаю ошибку компоновщика. Я хотел бы действительно понять то, что это означает. Ошибка:
/usr/lib/libwx_baseu-2.8.so: undefined reference to `std::ctype<char>::_M_widen_init() const@GLIBCXX_3.4.11'
То, что я не понимаю, - то, почему ошибка в libwx_baseu-2.8.so
. Я думал это .so
файлы имели все его разрешенные символы, вопреки .o
файлы этому все еще нужно соединение.
Когда я ldd
.so
, Я добираюсь, может разрешить все его связанные библиотеки, таким образом, нет никакой проблемы там:
$ ldd /usr/lib/libwx_baseu-2.8.so
linux-gate.so.1 => (0x00476000)
libz.so.1 => /lib/libz.so.1 (0x00d9c000)
libdl.so.2 => /lib/libdl.so.2 (0x002a8000)
libm.so.6 => /lib/libm.so.6 (0x00759000)
libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0x002ad000)
libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x0068d000)
libpthread.so.0 => /lib/libpthread.so.0 (0x006f0000)
libc.so.6 => /lib/libc.so.6 (0x00477000)
/lib/ld-linux.so.2 (0x007f6000)
Это означает что .so
файл не был скомпилирован правильно (в этом случае, это - ошибка в моем пакете распределения), или это означает, что там пропускают библиотеки по командной строке компоновщика для моей конкретной программы?
Кроме того, Вы знаете, как я могу получить список на неопределенных символах в файле ELF. Я попробовал readelf -s
но я не могу найти отсутствующий символ.
Спасибо.
Mildred
Я думаю, вы не ссылаетесь на некоторые библиотеки при компоновке вашей программы.
Вы должны связать в своей программе все разделяемые библиотеки, на которые вы ссылаетесь в вашем .so
Если .so связан с некоторыми статическими библиотеками - в программе не требуется связываться с ними, если все необходимые символы найдены в .so
. Вы можете использовать команду nm
linux, чтобы увидеть символы в объектном файле, библиотеке или двоичном файле
Edit
Ваша конкретная проблема может быть описана здесь: http: //old.nabble.com/-Bug-49433--gcc4.4,-NEW:-gcc4.4-misses-std::endl-implementation-at--O2%2B-td22836171.html
Когда вы связываете общую библиотеку с другими разделяемыми библиотеками (например, ссылка libwx_baseu-2.8.so
на libstdc ++. So
), компоновщик записывает символы версий, используемые libwx_baseu
и предоставляемые libstdc ++
.
Если во время выполнения вы используете другую копию libstdc ++
(та, которая не предоставляет тот же символ (символы) с версией), вы получите (динамическую) ошибку симпатии, и программа не запустится вообще (это предпочтительнее, чем "загадочный" сбой позже).
Но здесь происходит то, что вы пытаетесь связать исполняемый файл, что означает, что (статический) компоновщик хочет найти все символы, которые потребуются во время выполнения. Опять же, вы связываете исполняемый файл с другой (более старой) libstdc ++. So
, поэтому связывание не удается.
Обычно есть две основные причины:
- либо вы связали libwx_baseu-2.8.so
в другой системе (с более новой версией GCC) и скопировали ее в текущая система или
- вы связали libwx_baseu-2.8.so
с более новым GCC в той же системе, но теперь пытаетесь связать исполняемый файл со старым GCC .
Я думал, что все символы файлов .so разрешены, в отличие от файлов .o, которые все еще нуждаются в компоновке.
Общие библиотеки могут быть неполными, это нормально.
знаете ли вы, как я могу получить список неопределенных символов в файле ELF
Используйте
nm -C -u libwx_baseu-2.8.so