Нужны ли программе дополнительные символы из общей библиотеки .so кроме тех, которые объявлены в заголовочном файле? - PullRequest
5 голосов
/ 03 марта 2010

В программировании на Си я думал, что объектный файл может быть успешно связан с файлом .so, если в файле .so есть все символы, которые были объявлены в заголовочном файле.

Предположим, у меня есть foo.c, bar.h и две библиотеки libbar.so.1 и libbar.so.2. Реализация libbar.so.1 и libbar.so.2 полностью отличается, но я думаю, что все в порядке, если они оба предлагают функции, объявленные в bar.h.

Я связал foo.o с libbar.so.1 и создал исполняемый файл: foo.bin. Этот исполняемый файл работал, когда libbar.so.1 находится в LD_LIBRARY_PATH. (Конечно, символическая ссылка сделана как libbar.so). Однако, когда я изменяю символическую ссылку на libbar.so.2, foo.bin не может работать и жаловался :

 undefined symbol: _ZSt4cerr

libbar.so.1 - это библиотека, созданная на С ++, а libbar.so.2 - это библиотека, построенная на С. Я не понимаю, почему foo.bin нужны эти связанные с c ++ символы, значащие только в самой libbar.so.1, поскольку foo.bin построен на чистом коде c foo.c.

Ответы [ 4 ]

3 голосов
/ 03 марта 2010

_ZSt4cerr, очевидно, является искаженным именем C ++.Возможно, вам придется проверить, используете ли вы правильный компилятор (gcc / g ++, я знаю, это звучит глупо, но я случайно натолкнулся на такую ​​путаницу;)), и есть ли в файле bar.h какие-либо макросы, которые могли бы иметьссылка на cerr.

2 голосов
/ 03 марта 2010

Вы должны разобрать имя c ++ перед поиском. Для gcc есть утилита с ++ фильтра:

$ c++filt
_ZSt4cerr
std::cerr

Это просто стандартный поток файлов ошибок.

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

Утверждение в вопросе просто неверно. Вы говорите, «заголовочный файл». Не существует такого понятия, как « заголовочный файл (один-единственный)». Если вы имеете в виду «заголовочный файл, объявляющий определенный класс C ++», то этот класс может наследоваться от других классов. Или это может использовать исключения. Или RTTI. В этом случае, по умолчанию .so, содержащий код, который идет вместе с ним, будет содержать «висящие неопределенные символы». По умолчанию ожидается, что основная программа находится на C ++ и ссылается на среду выполнения C ++.

Можно создать автономный .so, но вам нужно проделать дополнительную работу для его создания. Возможно, вам придется использовать -Bsymbolic или указать несколько библиотек -l при его связывании, или и то, и другое. Эта область недостаточно документирована и обычно требует некоторой археологии.

0 голосов
/ 03 марта 2010

Возможно, вы просто забыли связать всю программу со стандартной библиотекой C ++.

...