Вам нужна статическая версия библиотеки, чтобы связать ее.
Общая библиотека на самом деле является исполняемым файлом в специальном формате с указанными точками входа (включая некоторые проблемы с липкой адресацией). Он не имеет всей информации, необходимой для статической ссылки.
Вы не можете статически связать разделяемую библиотеку (или динамически связать статическую).
Флаг -staticзаставит компоновщик использовать статические библиотеки (.a) вместо общих (.so). Но статические библиотеки не всегда устанавливаются по умолчанию, поэтому вам может потребоваться установить статическую библиотеку самостоятельно.
Другой возможный подход заключается в использовании статификатора или горностая . Оба инструмента принимают в качестве входных данных динамически связанный исполняемый файл и в качестве выходных данных создают автономный исполняемый файл со всеми встроенными общими библиотеками.
Разве нет способа сказать gcc напрямую, что связывать статически, а не обойти его и поговорить с компоновщиком?
Элазар Лейбович
1
@ElazarLeibovich Вы не можете получить комбинацию статики и динамики таким образом.
Хаожунь
@EugeneBujak: предостережение не распространяется на мою систему. Пример: gcc -o main main.cc -Wl,-rpath=. -Wl,-Bdynamic -lB -Wl,-Bstatic -lA -Wl,-Bdynamic -L.libB использует libA , она связана и lddне показывает ссылку на libA . Исполняемый файл работает отлично. Протестировано с g ++ 4.7.3.
radix
Непрямая (вложенная) статическая зависимость от прямой динамической зависимости сама по себе не становится динамически связанной.
Винни
Рассмотрим следующее: binA зависит от libB.so, который зависит от libC.a. Как уже говорили другие, .so сами являются исполняемыми файлами, поэтому, когда общий объект связан, любые статические библиотечные зависимости обрабатываются компоновщиком почти так же, как если бы исполняемый файл был связан: единственные символы, извлеченные из статической библиотеки .a, - это те, на которые ссылается (и не решает) .so. Это означает, что если binA ссылается на символ в libC.a, на который нет ссылок нигде в libB.so, то даже если binA ссылается на libB.so, этот символ будет неопределенным (кроме случаев, когда -Wl, - весь архив используется при компоновке libB.so).
Винни
18
Если у вас есть файл .a вашей общей библиотеки (.so), вы можете просто включить его в полный путь, как если бы это был объектный файл, например так:
Это генерирует main.o просто компилируя:
gcc -c main.c
Это связывает этот объектный файл с соответствующей статической библиотекой и создает исполняемый файл (с именем «main»):
gcc main.o mylibrary.a -o main
Или в одной команде:
gcc main.c mylibrary.a -o main
Это также может быть абсолютный или относительный путь:
Да, я знаю, что это 8-летний вопрос, но мне сказали, что можно статически связываться с библиотекой с разделяемыми объектами, и это было буквально лучшим ударом, когда я искал дополнительную информацию об этом.
Чтобы на самом деле продемонстрировать, что статическое связывание библиотеки разделяемых объектов невозможно с ld( gccкомпоновщиком) - в отличие от просто группы людей, которые настаивают на том, что это невозможно - используйте следующую gccкоманду:
(Конечно , вы должны собрать objectname.oиз sourcename.c, и вы , вероятно , следует сделать свою собственную библиотеку разделяемой объекта , а также. Если вы это сделаете, использование -Wl,--library-path,.так что л.д. может найти свою библиотеку в локальном каталоге.)
Фактическая ошибка, которую вы получаете:
/usr/bin/ld: attempted static link of dynamic object `libnamespec.so'
collect2: error: ld returned 1 exit status
Ответы:
Ссылаться на:
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). Но статические библиотеки не всегда устанавливаются по умолчанию, поэтому вам может потребоваться установить статическую библиотеку самостоятельно.Другой возможный подход заключается в использовании статификатора или горностая . Оба инструмента принимают в качестве входных данных динамически связанный исполняемый файл и в качестве выходных данных создают автономный исполняемый файл со всеми встроенными общими библиотеками.
источник
Если вы хотите связать, скажем, libapplejuice статически, но не, скажем, liborangejuice , вы можете связать это так:
Есть предостережение - если
liborangejuice
используетlibapplejuice
, тоlibapplejuice
будет также динамически связан.Вы должны связать
liborangejuice
статически вместе с ,libapplejuice
чтобы получитьlibapplejuice
статический заряд.И не забывайте, что
-Wl,-Bdynamic
иначе вы в конечном итоге будете связывать все статическое, в том числеlibc
(что не очень хорошая вещь).источник
gcc -o main main.cc -Wl,-rpath=. -Wl,-Bdynamic -lB -Wl,-Bstatic -lA -Wl,-Bdynamic -L.
libB использует libA , она связана иldd
не показывает ссылку на libA . Исполняемый файл работает отлично. Протестировано с g ++ 4.7.3.Если у вас есть файл .a вашей общей библиотеки (.so), вы можете просто включить его в полный путь, как если бы это был объектный файл, например так:
Это генерирует main.o просто компилируя:
Это связывает этот объектный файл с соответствующей статической библиотекой и создает исполняемый файл (с именем «main»):
Или в одной команде:
Это также может быть абсолютный или относительный путь:
источник
Да, я знаю, что это 8-летний вопрос, но мне сказали, что можно статически связываться с библиотекой с разделяемыми объектами, и это было буквально лучшим ударом, когда я искал дополнительную информацию об этом.
Чтобы на самом деле продемонстрировать, что статическое связывание библиотеки разделяемых объектов невозможно с
ld
(gcc
компоновщиком) - в отличие от просто группы людей, которые настаивают на том, что это невозможно - используйте следующуюgcc
команду:(Конечно , вы должны собрать
objectname.o
изsourcename.c
, и вы , вероятно , следует сделать свою собственную библиотеку разделяемой объекта , а также. Если вы это сделаете, использование-Wl,--library-path,.
так что л.д. может найти свою библиотеку в локальном каталоге.)Фактическая ошибка, которую вы получаете:
Надеюсь, это поможет.
источник
Немного поздно, но ... Я нашел ссылку, которую я сохранил пару лет назад, и подумал, что она может быть полезна вам, ребята:
CDE: автоматически создавать переносимые приложения Linux
http://www.pgbovine.net/cde.html
Выполните двоичный файл, передав в качестве аргумента имя двоичного файла, который вы хотите сделать переносимым, например: nmap
./cde_2011-08-15_64bit nmap
Программа прочитает все библиотеки, связанные с nmap и его зависимостями, и сохранит их в папке cde-package / (в том же каталоге, что и вы).
Помните, что для запуска переносимой программы вы должны выполнить исполняемый файл, расположенный в cde-package / nmap.cde
С уважением
источник
В gcc это не поддерживается. Фактически, это не поддерживается ни в одном существующем компиляторе / компоновщике, о котором я знаю.
источник