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.