Статическая ссылка функции разделяемой библиотеки в gcc
Как я могу статически связать функцию общей библиотеки в gcc?
6 ответов
Ссылаться на:
http://linux.derkeiler.com/Newsgroups/comp.os.linux.development.apps/2004-05/0436.html
Вам нужна статическая версия библиотеки для связи.
Общая библиотека на самом деле является исполняемым файлом в специальном формате с указанными точками входа (включая некоторые проблемы с липкой адресацией). Он не имеет всей информации, необходимой для статической ссылки.
Вы не можете статически связывать разделяемую библиотеку (или динамически связывать статическую)
Флаг -static заставит компоновщик использовать статическую библиотеку (.a) вместо общей (.so) Но. Статические библиотеки не всегда устанавливаются по умолчанию. Поэтому, если вам нужна статическая ссылка, вы должны установить статические библиотеки.
Другой возможный подход - использование статификатора или горностая. Оба инструмента принимают в качестве входных данных динамически связанный исполняемый файл и в качестве выходных данных создают автономный исполняемый файл со всеми встроенными общими библиотеками.
Если вы хотите связать, скажем, libapplejuice статически, но не, скажем, liborangejuice, вы можете связать это так:
gcc object1.o object2.o -Wl,-Bstatic -lapplejuice -Wl,-Bdynamic -lorangejuice -o binary
Есть предостережение - если liborangejuice
использования libapplejuice
, затем libapplejuice
будет динамически связан тоже.
Вам придется связать liborangejuice
статически рядом с libapplejuice
получить libapplejuice
статичный.
И не забудьте сохранить -Wl,-Bdynamic
иначе вы в конечном итоге будете связывать все статическое, включая libc
(что не очень хорошая вещь).
Да, я знаю, что это 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
Надеюсь, это поможет.
Если у вас есть файл.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
Немного поздно, но... Я нашел ссылку, которую я сохранил пару лет назад, и подумал, что она может быть полезна вам, ребята:
CDE: автоматически создавать переносимые приложения Linux
http://www.pgbovine.net/cde.html
- Просто скачайте программу
Выполните двоичный файл, передав в качестве аргумента имя двоичного файла, который вы хотите сделать переносимым, например: nmap
./cde_2011-08-15_64bit nmap
Программа прочитает все библиотеки, связанные с nmap и его зависимостями, и сохранит их в папке cde-package / (в том же каталоге, что и вы).
- Наконец, вы можете сжать папку и развернуть переносимый двоичный файл в любой системе.
Помните, что для запуска переносимой программы вы должны выполнить исполняемый файл, расположенный в cde-package/nmap.cde
С наилучшими пожеланиями
В gcc это не поддерживается. Фактически, это не поддерживается ни в одном существующем компиляторе / компоновщике, о котором я знаю.