Получить файл, вызывающий ошибку компоновщика в g ++ - PullRequest
2 голосов
/ 15 марта 2011

Я строю двоичный файл, который использует несколько компонентов, которые скомпилированы как файлы .so. Я получаю множество ошибок компоновщика, которые указывают, какой файл .so вызвал их, но могу ли я получить информацию о том, какие файлы вызывают неопределенные функции или, если возможно, в местах исходного кода, где вызываются неопределенные функции? Я нахожу слишком утомительным выискивать функцию esp, так как используется много перегрузок и шаблонов (что во многих местах означает одно и то же имя). В Windows это показывает, какой файл .o вызвал неопределенный символ, но я застрял на уровне библиотек в Linux. Я использую G ++ в Linux. Любой указатель был бы полезен.

Ответы [ 2 ]

3 голосов
/ 16 марта 2011

Вы спрашиваете "какой объектный файл в общей библиотеке вызывает ошибку".

Проблема в том, что к тому времени, когда разделяемая библиотека была связана, все объектные файлы были "слиты воедино" и больше не существуют внутри разделяемой библиотеки как отдельные сущности, поэтому ваш вопрос несколько бессмыслен.

Тем не менее, если вы выполните отладочную сборку (с флагом -g), компоновщик сообщит вам, какой файл и строка source вызывают проблему, которую вы затем сможете перевести в объектный файл.

Если вы не можете (например, потому что символ проблемы указан в заголовочном файле), вы можете обратиться за помощью к компоновщику: заново пересобрать библиотеку, передав компоновщик -y флаг:

g++ -fPIC -shared ${OBJECTS} -o foo.so -Wl,-y,my_unresolved_symbol

сообщит вам, на какой объект (ы) ссылается my_unresolved_symbol.

Примечание: компоновщик работает «ниже» C ++, поэтому вы должны передать искаженное имя, например, _Znw к нему.

0 голосов
/ 15 марта 2011

С помощью ldd (печать зависимостей совместно используемой библиотеки) вы можете проверить зависимости и, если они разрешены или нет.

С помощью nm -Aa --demangle вы можете получить список символов, используемых или определенных в файле * .so, если они не были удалены. Используемые символы должны как минимум остаться, чтобы вы могли проверить, есть ли какие-нибудь неразрешенные символы.

...