Как связать функцию общей библиотеки статически в gcc?
Статическая ссылка функции общей библиотеки в gcc
Ответ 1
Обратитесь к:
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 это не поддерживается. Фактически, это не поддерживается ни в каком существующем компиляторе/компоновщике, о котором я знаю.