Разрешение символов в статических и динамических библиотеках - PullRequest
1 голос
/ 15 февраля 2012

Существует проект свободного программного обеспечения, который создает некоторые статические библиотеки C ++, а затем связывает их для создания двоичного файла.Я хотел бы выделить библиотеки в виде файлов .so для динамической компоновки (чтобы другие проекты могли использовать библиотеку).Одна библиотека собирается просто отлично, но когда я пытаюсь связать ее, я получаю ошибки «неопределенная ссылка».

Это легко отследить и исправить (код ссылается на эти методы в файле .h, но соответствуетФайл .cc не был включен в команду компиляции Makefile).Мне, однако, интересно, почему, в общем, библиотека могла бы просто отлично связываться как статическая библиотека, а не как динамическая библиотека.Что делают g ++ и ld в одном случае, а не в другом?

Большое спасибо.

Ответы [ 2 ]

5 голосов
/ 16 февраля 2012

статические библиотеки , созданные с помощью ar - это просто набор объектных файлов. ar - очень простой архиватор. На момент ссылки не разрешены зависимости, см. Справочную страницу ar .

Общие объекты с другой стороны, или динамические библиотеки, как вы их называете, - это совсем другой зверь. Они реализуют двоичный формат ELF и имеют сложный набор правил. Они также имеют инициализирующий код, и некоторые зависимости разрешаются во время соединения. См. http://www.akkadia.org/drepper/dsohowto.pdf и http://www.akkadia.org/drepper/goodpractice.pdf для более глубокого введения.

0 голосов
/ 18 февраля 2012

но когда я пытаюсь связать его, я получаю ошибки "неопределенная ссылка".

Покажите нам свою команду ссылки. Ошибки «неопределенной ссылки» обычно не ожидаются при связывании совместно используемой библиотеки, потому что совместно используемым библиотекам разрешено (по умолчанию) иметь неразрешенные символы.

Или вы имели в виду, что вы получаете ошибки «неопределенная ссылка» при связывании конечного исполняемого файла с общей библиотекой?

...