ELF: соединение: Почему я получаю неопределенные ссылки в .so файлах

Я пытаюсь создать программу против 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

7
задан Mildred 15 April 2010 в 08:26
поделиться

3 ответа

Я думаю, вы не ссылаетесь на некоторые библиотеки при компоновке вашей программы.

Вы должны связать в своей программе все разделяемые библиотеки, на которые вы ссылаетесь в вашем .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

3
ответ дан 6 December 2019 в 14:02
поделиться

Когда вы связываете общую библиотеку с другими разделяемыми библиотеками (например, ссылка 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 .

4
ответ дан 6 December 2019 в 14:02
поделиться

Я думал, что все символы файлов .so разрешены, в отличие от файлов .o, которые все еще нуждаются в компоновке.

Общие библиотеки могут быть неполными, это нормально.

знаете ли вы, как я могу получить список неопределенных символов в файле ELF

Используйте

nm -C -u libwx_baseu-2.8.so

7
ответ дан 6 December 2019 в 14:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: