Відповіді:
Відноситься до:
http://linux.derkeiler.com/Newsgroups/comp.os.linux.development.apps/2004-05/0436.html
Вам потрібна статична версія бібліотеки, щоб зв’язати її.
Спільна бібліотека - це справді виконуваний файл у спеціальному форматі із зазначенням точок входу (а також деякі липкі проблеми вирішення). У ньому немає всієї інформації, необхідної для статичного зв’язку.
Ви не можете статично зв’язати спільну бібліотеку (або динамічно зв'язати статичну).
Прапор -static
змусить лінкер використовувати статичні бібліотеки (.a) замість спільних (.so). Але статичні бібліотеки не завжди встановлюються за замовчуванням, тому вам, можливо, доведеться встановлювати статичну бібліотеку самостійно.
Інший можливий підхід - використовувати статифікатор або Ermine . Обидва інструменти приймають як вхід динамічно пов'язаний виконуваний файл і як вихід створюють автономний виконуваний файл з усіма вбудованими бібліотеками.
Якщо ви хочете пов’язати, скажімо, libapplejuice статично, але не, скажімо, liborangejuice , ви можете зв’язати так:
gcc object1.o object2.o -Wl,-Bstatic -lapplejuice -Wl,-Bdynamic -lorangejuice -o binary
Є застереження - якщо 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, просто компілюючи:
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
Так, я знаю, що це 8-річне запитання, але мені сказали, що можна статично зв’язатись із бібліотекою спільних об'єктів, і це було буквально найкращим ударом, коли я шукав додаткову інформацію про це.
Для того, щоб фактично продемонструвати, що статично зв’язувати бібліотеку спільних об'єктів неможливо з ld
( gcc
's 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
Сподіваюся, що це допомагає.
Трохи пізно, але ... Я знайшов посилання, яке я врятував пару років тому, і я подумав, що може бути корисним для вас, хлопці:
CDE: Автоматичне створення портативних програм для Linux
http://www.pgbovine.net/cde.html
Виконайте бінарний прохід як аргумент ім'я бінарного файлу, який ви хочете зробити портативним, наприклад: nmap
./cde_2011-08-15_64bit nmap
Програма прочитає всі файли, пов'язані з nmap та його залежностями, і збереже їх у папці, що називається cde-package / (у тому самому каталозі, що і ви).
Пам'ятайте, що для запуску портативної програми вам потрібно виконати бінарний файл, розташований у cde-package / nmap.cde
З найкращими побажаннями