Yanıtlar:
Bakınız:
http://linux.derkeiler.com/Newsgroups/comp.os.linux.development.apps/2004-05/0436.html
Bağlamak için kütüphanenin statik sürümüne ihtiyacınız vardır.
Paylaşılan kitaplık aslında giriş noktaları belirtilmiş (ve bazı yapışkan adresleme sorunları dahil) özel bir biçimde yürütülebilir bir dosyadır. Statik olarak bağlanmak için gereken tüm bilgilere sahip değildir.
Paylaşılan bir kütüphaneyi statik olarak bağlayamazsınız (veya statik bir kütüphaneyi dinamik olarak bağlayamazsınız).
Bayrak -static
, bağlayıcıyı paylaşılan (.so) yerine statik kitaplıklar (.a) kullanmaya zorlar. Ancak statik kitaplıklar her zaman varsayılan olarak yüklenmez, bu nedenle statik kitaplığı kendiniz yüklemeniz gerekebilir.
Olası başka bir yaklaşım, statifier veya Ermine kullanmaktır . Her iki araç da girdi olarak dinamik olarak bağlanmış bir yürütülebilir dosya alır ve çıktı da tüm paylaşılan kitaplıkların gömülü olduğu bağımsız bir yürütülebilir dosya oluşturur.
Bağlantıya, söz hakkından, isterseniz libapplejuice statik değil, diyelim ki, liborangejuice , böyle bağlayabilirsiniz:
gcc object1.o object2.o -Wl,-Bstatic -lapplejuice -Wl,-Bdynamic -lorangejuice -o binary
Bir uyarı var - liborangejuice
kullanırsa libapplejuice
, o libapplejuice
zaman da dinamik olarak bağlanacaktır.
liborangejuice
Statik libapplejuice
olabilmek için libapplejuice
statik olarak yanınıza bağlamanız gerekir .
Ve bunu da -Wl,-Bdynamic
dahil olmak üzere her şeyi statik olarak bağlayacaksınız libc
(bunu yapmak iyi bir şey değildir).
gcc -o main main.cc -Wl,-rpath=. -Wl,-Bdynamic -lB -Wl,-Bstatic -lA -Wl,-Bdynamic -L.
libB kullanan LIBA , bağlandığı ve ldd
bir referans göstermez LIBA . Yürütülebilir dosya gayet iyi çalışıyor. G ++ 4.7.3 ile test edilmiştir.
Paylaşılan kitaplığınızın (.so) .a dosyasına sahipseniz, dosyayı tam yoluna bir nesne dosyasıymış gibi ekleyebilirsiniz, örneğin:
Bu, main.o dosyasını yalnızca derleyerek oluşturur:
gcc -c main.c
Bu, nesne dosyasını ilgili statik kitaplıkla bağlar ve yürütülebilir dosyayı oluşturur ("main" olarak adlandırılır):
gcc main.o mylibrary.a -o main
Veya tek bir komutta:
gcc main.c mylibrary.a -o main
Ayrıca mutlak veya göreceli bir yol da olabilir:
gcc main.c /usr/local/mylibs/mylibrary.a -o main
Evet, bunun 8 yaşında bir soru olduğunu biliyorum, ancak paylaşılan bir nesne kütüphanesine statik olarak bağlamanın mümkün olduğu söylendi ve bu konuda daha fazla bilgi aradığımda tam anlamıyla en iyi hit oldu.
Bir paylaşımlı nesne kitaplığını statik olarak bağlamanın ld
( gcc
's bağlayıcı) ile mümkün olmadığını göstermek için - sadece mümkün olmadığında ısrar eden bir grup insanın aksine - aşağıdaki gcc
komutu kullanın:
gcc -o executablename objectname.o -Wl,-Bstatic -l:libnamespec.so
(Tabii ki derlemek gerekecek objectname.o
dan sourcename.c
ve muhtemelen de kendi paylaşılan nesne kitaplığı oluşturan gerekir. Bunu yaparsanız, kullanım -Wl,--library-path,.
o ld nedenle yerel dizinde kütüphanenizi bulabilirsiniz.)
Aldığınız asıl hata:
/usr/bin/ld: attempted static link of dynamic object `libnamespec.so'
collect2: error: ld returned 1 exit status
Umarım yardımcı olur.
Biraz geç ama ... Birkaç yıl önce kaydettiğim bir bağlantı buldum ve bunun sizin için yararlı olabileceğini düşündüm:
CDE: Otomatik olarak taşınabilir Linux uygulamaları oluşturun
http://www.pgbovine.net/cde.html
Taşınabilir geçiş yapmak istediğiniz ikilinin adını bağımsız değişken olarak ikili geçişi yürütün, örneğin: nmap
./cde_2011-08-15_64bit nmap
Program, nmap ve bağımlılarına bağlı tüm kütüphaneleri okuyacak ve hepsini cde-package / (aynı dizinde olduğunuz) bir klasöre kaydedecektir .
Unutmayın, taşınabilir programı başlatmak için cde-package / nmap.cde dosyasında bulunan ikili dosyayı çalıştırmanız gerekir.
Saygılarımla