Статическая ссылка функции разделяемой библиотеки в gcc - PullRequest
121 голосов
/ 07 апреля 2009

Как я могу статически связать функцию общей библиотеки в gcc?

Ответы [ 6 ]

95 голосов
/ 07 апреля 2009

См .:

http://www.linuxquestions.org/questions/linux-newbie-8/forcing-static-linking-of-shared-libraries-696714/

http://linux.derkeiler.com/Newsgroups/comp.os.linux.development.apps/2004-05/0436.html

Вам нужна статическая версия библиотеки для связи.

Общая библиотека на самом деле является исполняемым файлом в специальном формате. с указанными точками входа (и некоторыми проблемами с адресацией входит в комплект). Он не имеет всей информации, необходимой для ссылка статически.

Вы не можете статически связывать разделяемую библиотеку (или динамически связывать статическую)

Флаг -static заставит компоновщик использовать статическую библиотеку (.a) вместо общей (.so) Но. Статические библиотеки не всегда устанавливаются по умолчанию. Поэтому, если вам нужна статическая ссылка, вы должны установить статические библиотеки.

Другим возможным подходом является использование statifier или Ermine . Оба инструмента принимают в качестве входных данных динамически связанный исполняемый файл и в качестве выходных данных создают автономный исполняемый файл со всеми встроенными общими библиотеками.

72 голосов
/ 02 июня 2009

Если вы хотите связать, скажем, libapplejuice статически, но не, скажем, liborangejuice , вы можете связать это так:

gcc object1.o object2.o -Wl,-Bstatic -lapplejuice -Wl,-Bdynamic -lorangejuice -o binary

Предостережение: если liborangejuice использует libapplejuice, то libapplejuice также будет динамически связан.

Вам нужно будет статически связать liborangejuice с libapplejuice, чтобы получить libapplejuice статический.

И не забудьте оставить -Wl,-Bdynamic, иначе вы в конечном итоге будете связывать все статическое, включая libc (что не очень хорошая вещь).

18 голосов
/ 06 сентября 2011

Если у вас есть файл .a вашей общей библиотеки (.so), вы можете просто включить его в полный путь, как если бы это был объектный файл, например:

Это генерирует main.o просто компилируя:

gcc -c main.c

Связывает этот объектный файл с соответствующей статической библиотекой и создает исполняемый файл (с именем "main"):

gcc main.o mylibrary.a -o main

Или в одной команде:

gcc main.c mylibrary.a -o main

Это также может быть абсолютный или относительный путь:

gcc main.c /usr/local/mylibs/mylibrary.a -o main
7 голосов
/ 11 декабря 2017

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

Чтобы на самом деле продемонстрировать, что статическое связывание библиотеки общего объекта невозможно с ld (компоновщик gcc) - в отличие от просто группы людей, которые настаивают, что это невозможно - используйте следующее gcc команда:

gcc -o executablename objectname.o -Wl,-Bstatic -l:libnamespec.so

(Конечно, вам придется скомпилировать objectname.o из sourcename.c, и вам, вероятно, следует также создать собственную библиотеку разделяемых объектов. Если вы это сделаете, используйте -Wl,--library-path,., чтобы ld мог найдите вашу библиотеку в локальном каталоге.)

Фактическая ошибка, которую вы получаете:

/usr/bin/ld: attempted static link of dynamic object `libnamespec.so'
collect2: error: ld returned 1 exit status

Надеюсь, это поможет.

7 голосов
/ 12 марта 2015

Немного поздно, но ... Я нашел ссылку, которую я сохранил пару лет назад, и подумал, что она может быть полезна вам, ребята:

CDE: Автоматически создавать переносимые приложения Linux

http://www.pgbovine.net/cde.html

  • Просто скачайте программу
  • Выполнить двоичную передачу в качестве аргумента имя двоичного файла, который вы хотите сделать переносимым, например: nmap

    . / Cde_2011-08-15_64bit nmap

Программа прочитает все библиотеки, связанные с nmap и его зависимостями, и сохранит их в папке с именем cde-package / (в том же каталоге, что и вы).

  • Наконец, вы можете сжать папку и развернуть переносимый двоичный файл в любой системе.

Помните, что для запуска переносимой программы вам нужно выполнить исполняемый файл, расположенный в cde-package / nmap.cde

С наилучшими пожеланиями

0 голосов
/ 07 апреля 2009

В gcc это не поддерживается. На самом деле, это не поддерживается ни одним из существующих компиляторов / компоновщиков, о которых я знаю.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...