GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Was bedeutet Warnung:Das Verknüpfen der gemeinsam genutzten Bibliothek mit der statischen Bibliothek ist nicht portierbar?

Stellen Sie sicher, dass Objektdateien in libmxml.a wurden mit -fPIC gebaut . Es ist notwendig, eine gemeinsam genutzte Bibliothek aufzubauen. Siehe auch http://tldp.org/HOWTO/Program-Library-HOWTO/shared-libraries.html

Hier ist ein kurzes Beispiel

$ cat stat.c 
int five() { return 5; }
$ gcc -c stat.c -fPIC
$ ar crus libstat.a stat.o
$ cat dynamic.c
int ten() { return five() + five(); }
$ gcc -c dynamic.c -fPIC
$ gcc -shared -o libdyn.so dynamic.o -L. -lstat
$ ldd libdyn.so # Just to show static linkage to libstat.a
  linux-vdso.so.1 =>  (0x00007fffca1b8000)
  libc.so.6 => /lib/libc.so.6 (0x00007fc004649000)
  /lib/ld-linux-x86-64.so.2 (0x00007fc004bf7000)
$ cat main.c 
int main() { return ten(); }
$ gcc main.c -L. -ldyn
$ LD_LIBRARY_PATH=. ./a.out 
$ echo $?
10

Es ist nicht möglich, gemeinsam genutzte Bibliotheken mit statischen Bibliotheken zu verknüpfen (es sei denn, Sie wissen wirklich sehr gut, was Sie tun). Tu es nicht.

Die erste Warnung kommt von libtool. Es sagt Ihnen, dass die von Ihnen angeforderte Operation auf verschiedenen Systemen unterschiedliche Dinge tun wird und einige dieser Dinge wahrscheinlich nicht das sind, was Sie wollen. Oft wird es einfach auf verschiedene spektakuläre Weise scheitern, weil Code, der in gemeinsam genutzte und statische Bibliotheken kommt, mit unterschiedlichen Compiler-Flags kompiliert werden muss.

Die zweite Warnung stammt von gcc. Es sagt Ihnen, dass beim Kompilieren eine statische Bibliothek bereitgestellt wird ist sinnlos. Das liegt daran, dass Sie $(PATH)/libmxml.a haben in CFLAGS , wo es nichts zu suchen hat. Tatsächlich sollten Sie dies meistens nicht tun haben $(PATH)/libmxml.a , aber -L$(PATH) -lmxml stattdessen. Das sollte noch in LDFLAGS gehen , aber gcc wird sich nicht beschweren, wenn dies auch zur Compiler-Befehlszeile gelangt.


Linken der gemeinsam genutzten Bibliothek libgstmatroskademux.la gegen die statische Bibliothek

Dies warnt Sie, dass wenn Sie z.B. versuchte, dies auf 64-Bit-Linux zu erstellen, würde es wahrscheinlich fehlschlagen. Das liegt daran, dass auf x86_64 aller Code, der in eine gemeinsam genutzte Bibliothek gelinkt wird, muss mit -fPIC kompiliert werden Flag und Code, der in .a lebt Bibliotheken normalerweise nicht.

gcc:.../libmxml.a:Linker-Eingabedatei wird nicht verwendet, da das Linken nicht durchgeführt wurde

Dies warnt Sie, dass Sie eine falsche Befehlszeile haben. Höchstwahrscheinlich kompilieren Sie etwas und haben -c auf der Befehlszeile (was GCC mitteilt, nach dem Kompilieren der Quelle zu stoppen, und nicht Verknüpfung durchführen). Da Sie auch libmxml.a liefern Auf derselben Befehlszeile erkannte GCC, dass Sie nicht wissen, was Sie tun, und warnte Sie, (mehr) darüber nachzudenken.


Linux
  1. Was ist der LD_PRELOAD-Trick?

  2. Konvertieren Sie eine statische Bibliothek in eine gemeinsam genutzte Bibliothek?

  3. Statischer Link der gemeinsam genutzten Bibliotheksfunktion in gcc

  4. Was bedeutet 1 am Ende des awk-Skripts?

  5. Was bedeutet curl -k -i -X ​​unter Linux?

Linken einer gemeinsam genutzten Bibliothek mit einer anderen gemeinsam genutzten Bibliothek unter Linux

Umzug R_X86_64_32S gegen Verknüpfungsfehler

Woher wissen Sie, dass die angegebene gemeinsam genutzte Bibliothek mit Debug-Symbolen erstellt wurde oder nicht?

Was bedeutet ein doppeltes Dollarzeichen in Bash/Makefile?

Was bedeutet „auf der schwarzen Liste“ bei GStreamer?

Wie listet man Abhängigkeiten der statischen c/c++-Bibliothek auf?