g ++ vs gcc, связывание проблемы со статической библиотекой (.a) - PullRequest
1 голос
/ 04 апреля 2011

Я пытаюсь связать файл статической библиотеки (.a) с файлом .o, который предположительно использует символы из библиотеки.Однако при использовании gcc - возникает обычная ошибка компоновщика, независимо от того, используется ли файл .a как

gcc -L.ac staticlib.a

Однако та же команда работает с g ++ безупречно.

Почему это происходит?

Я вижу, что файл .c является полностью допустимым c (и, следовательно, c ++), но тогда почему gcc не может обнаружить символы в библиотеке?

Попытка найти символы в библиотеке с помощью objdump, была в состоянии найти близко похожие символы, но не точные.Например:

Получен 00000000000000b0 г F. текст 000000000000004e _ * Z15PhttsFn_InitTTSPh * для символа * PhttsFn_InitTTS *

Может кто-нибудь объяснить, пожалуйста, это явление?Я также проверил архитектуру, для которой был скомпилирован файл библиотеки, и он такой же, как моя архитектура.

Спасибо!

1 Ответ

3 голосов
/ 04 апреля 2011

C ++ использует так называемое искажение имен, чтобы пространства имен, имена перегруженных функций и т. Д. Получали уникальные символы в скомпилированном объектном файле.

Ваш код C явно относится к символу PhttsFn_InitTTS. Теперь, если он скомпилирован как C, он выдаст именно это имя символа. Однако, поскольку C ++ должен иметь дело со всеми этими различными вариациями одного и того же имени (например, перегрузкой, с различными списками параметров), он создает «искаженное» пространство имен кодирования версии и типы параметров. В вашем случае он был искажен до Z15PhttsFn_InitTTSPh, в основном говоря, что нет пространства имен и параметров. (Я считаю, что Z15 означает 15-символьное имя; затем список параметров отсутствует).

Вызов GCC как gcc позволяет ему выбрать сам формат файла, основываясь на расширении файла (.c -> C, .cc или .cpp и т. Д. -> C ++). Вызов его как g ++ вызывает режим C ++.

Ваш .a-файл явно скомпилирован с использованием C ++, так как он разоблачил этот искаженный символ.

...