Статическая ссылка функции общей библиотеки в gcc

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

Ответ 1

Обратитесь к:

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

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

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

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

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

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

Ответ 2

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

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

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

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

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

Ответ 3

Если у вас есть файл .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

Ответ 4

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

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

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

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

    ./cde_2011-08-15_64bit nmap

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

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

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

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

Ответ 5

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

Чтобы на самом деле продемонстрировать, что статическая привязка библиотеки разделяемых объектов невозможна с ld (gcc linker) - в отличие от просто группы людей, которые настаивают на том, что это невозможно - используйте следующие 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

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

Ответ 6

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