PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : g++ shared und static Libraries linken



Ferox
24-01-2006, 16:24
Hallo

Ich bin ziemlich neu in der Programmierung unter Linux, da ich bisher immer nur unter Windows programmiert habe.
Für die Arbeit muss ich jetzt ein Projekt unter Linux weiterentwickeln.
Als Basis habe ich ein C++ Testprogramm mit 3 static Libraries .a und 2 shared Libraries. so bekommen.
Doch wenn ich das jetzt kompiliere und linke bekomme ich einige Fehler. Ich habe schon viel gegoogled doch komme nicht wirklich dahinter wo der Fehler liegt.

Zum Compilen mit dem g++ habe ich mit mir ein Skript geschrieben:

g++-3.4 -Wall -g -c test.cpp -o test.o

echo "compile success"
echo "___________________________________"

g++-3.4 -Wall -g -o test test.o -I. -L. -lEOT -lMobileCore -lMobileNumeric -lMobileCore -lMoAlgebra -lTinyXML

echo "link success"
echo "___________________________________"

#LD_LIBRARY_PATH="."
./test

Wenn ich nun damit versuche die Libraries zu linken bekomme ich eine Menge undefined Referencen in den Shared Libraries:

/libEOT.a(MoObstacle.o): In function
> `std::__simple_alloc<std::_List_node<MoObstacle*>,
> std::__default_alloc_template<true, 0>
>
> >::deallocate(std::_List_node<MoObstacle*>*, unsigned
>
> int)':/usr/include/g++/bits/stl_alloc.h:242: undefined reference to
> `std::__default_alloc_template<true, 0>::deallocate(void*, unsigned int)'
> ./libEOT.a(MoObstacle.o): In function
> `std::__simple_alloc<std::_List_node<MoObstacle*>,
> std::__default_alloc_template<true, 0> >::allocate(unsigned
> int)':/usr/include/g++/bits/stl_alloc.h:232: undefined reference to
> `std::__default_alloc_template<true, 0>::allocate(unsigned int)'
> ./libMobileCore.so: undefined reference to `lsodar_'
> ./libMobileCore.so: undefined reference to
> `std::__default_alloc_template<true, 0>::_S_free_list'
> ./libMobileCore.so: undefined reference to `srcar_'
> ./libMoAlgebra.so: undefined reference to `xerbla_'
> ./libMoAlgebra.so: undefined reference to `dscal_'
> ./libMobileCore.so: undefined reference to `hybrj_'
> ./libMobileCore.so: undefined reference to `dgetrs_'
> ./libMobileCore.so: undefined reference to
> `std::__default_alloc_template<true, 0>::_S_force_new'
> ./libMoAlgebra.so: undefined reference to `dswap_'
> ./libMoAlgebra.so: undefined reference to `e_wsfe'
> ./libMobileCore.so: undefined reference to `rpoly_'
> ./libMobileCore.so: undefined reference to `intdy_'
> ./libMobileCore.so: undefined reference to `hybrd_'
> ./libMobileCore.so: undefined reference to `dpptrs_'
> ./libMobileCore.so: undefined reference to `dspmv_'
> ./libMobileCore.so: undefined reference to `std::basic_istream<char,
> std::char_traits<char> >::seekg(long, std::_Ios_Seekdir)'
> ./libMobileCore.so: undefined reference to `dcopy_'
> ./libMobileCore.so: undefined reference to `ode_'
> ./libMobileCore.so: undefined reference to `dpptrf_'
> ./libMoAlgebra.so: undefined reference to `ddot_'
> ./libMoAlgebra.so: undefined reference to `dgemm_'
> ./libMobileCore.so: undefined reference to `std::basic_string<char,
> std::char_traits<char>, std::allocator<char> >::_S_empty_rep_storage'
> ./libMoAlgebra.so: undefined reference to `dtrsm_'
> ./libMoAlgebra.so: undefined reference to `do_fio'
> ./libMoAlgebra.so: undefined reference to `s_cat'
> ./libMobileCore.so: undefined reference to `dgetrf_'
> ./libMobileCore.so: undefined reference to
> `std::__default_alloc_template<true, 0>::_S_node_allocator_lock'
> ./libMoAlgebra.so: undefined reference to `idamax_'
> ./libMoAlgebra.so: undefined reference to `ilaenv_'
> ./libMoAlgebra.so: undefined reference to `dger_'
> ./libMoAlgebra.so: undefined reference to `daxpy_'
> ./libMobileCore.so: undefined reference to `dpptri_'
> ./libMobileCore.so: undefined reference to `vode_'
> ./libMoAlgebra.so: undefined reference to `lsame_'
> ./libMoAlgebra.so: undefined reference to `s_wsfe'
> collect2: ld returned 1 exit status

Muss ich vielleicht etwas beachten, wenn ich sowohl shared als auch static Libraries linken möchte?

anda_skoa
24-01-2006, 16:43
Sind die Libraries mit dem selben g++ kompilliert bzw gegen die selbe libstdc++ gelinkt worden?

Ciao,
_

Ferox
24-01-2006, 18:14
Die Libraries sind mir von einer Firma zur Verfügung gestellt worden. Angeblich sind sie mit dem gcc 3.3.4 kompiliert worden.
Deswegen hab ich schon von dem gcc 4.0 auf den gcc 3.4.5 zurück gewechselt.
Muss es exakt der selbe gcc sein?

SeeksTheMoon
25-01-2006, 11:34
Auf gcc.gnu.org kannst Du nachsehen zwischen welchen Compilerversionen es ABI-Änderungen und damit Codeinkompatibilitäten gibt.

anda_skoa
25-01-2006, 16:38
Ich glaube 3.4 und 4.0 haben die selbe ABI, aber 3.3 hat noch eine alte.

Ciao,
_

Ferox
26-01-2006, 08:23
So ist es wohl. Danke schonmal für die Hilfe.

Ich habe jetzt anstatt des 3.4.5 den 3.3.4 genommen und das hat die ganzen 'std::' Fehler behoben.

Allerdings tretten nun noch immer einige Fehler auf. Und zwar abhängig davon in welcher Reihen folge ich die Libraries verlinke.

Wenn ich gcc mit
g++ -Wall -g -o test test.o -I. -L. -lMoAlgebra -lMobileCore -lMobileNumeric -lEOT -lTinyXML aufrufe:

./libMobileNumeric.a(ilaenv.o): In function `.L3':
ilaenv.f:(.text+0xbe): undefined reference to `s_copy'
ilaenv.f:(.text+0x155): undefined reference to `s_copy'
ilaenv.f:(.text+0x169): undefined reference to `s_copy'
ilaenv.f:(.text+0x180): undefined reference to `s_copy'
ilaenv.f:(.text+0x1b7): undefined reference to `s_cmp'
ilaenv.f:(.text+0x1d2): undefined reference to `s_cmp'
ilaenv.f:(.text+0x203): undefined reference to `s_copy'
ilaenv.f:(.text+0x233): undefined reference to `s_cmp'
ilaenv.f:(.text+0x24e): undefined reference to `s_cmp'
ilaenv.f:(.text+0x26b): undefined reference to `s_cmp'
ilaenv.f:(.text+0x2a2): undefined reference to `s_cmp'
ilaenv.f:(.text+0x2d0): undefined reference to `s_cmp'
./libMobileNumeric.a(ilaenv.o):ilaenv.f:(.text+0x2ef ): more undefined
references to `s_cmp' follow
./libMobileNumeric.a(xerbla.o): In function `xerbla_':
xerbla.f:(.text+0x1c): undefined reference to `s_wsfe'
xerbla.f:(.text+0x31): undefined reference to `do_fio'
xerbla.f:(.text+0x40): undefined reference to `do_fio'
xerbla.f:(.text+0x45): undefined reference to `e_wsfe'
xerbla.f:(.text+0x55): undefined reference to `s_stop'
./libMobileNumeric.a(xerrwv.o): In function `xerrwv_':
xerrwv.f:(.text+0x8a): undefined reference to `s_wsfe'
xerrwv.f:(.text+0xac): undefined reference to `do_fio'
xerrwv.f:(.text+0xb7): undefined reference to `e_wsfe'
xerrwv.f:(.text+0xfd): undefined reference to `s_stop'
xerrwv.f:(.text+0x115): undefined reference to `s_wsfe'
xerrwv.f:(.text+0x12a): undefined reference to `do_fio'
xerrwv.f:(.text+0x139): undefined reference to `do_fio'
xerrwv.f:(.text+0x13e): undefined reference to `e_wsfe'
xerrwv.f:(.text+0x15b): undefined reference to `s_wsfe'
xerrwv.f:(.text+0x170): undefined reference to `do_fio'
xerrwv.f:(.text+0x175): undefined reference to `e_wsfe'
xerrwv.f:(.text+0x19a): undefined reference to `s_wsfe'
xerrwv.f:(.text+0x1af): undefined reference to `do_fio'
xerrwv.f:(.text+0x1be): undefined reference to `do_fio'
xerrwv.f:(.text+0x1c3): undefined reference to `e_wsfe'
xerrwv.f:(.text+0x1e3): undefined reference to `s_wsfe'
xerrwv.f:(.text+0x1f8): undefined reference to `do_fio'
xerrwv.f:(.text+0x1fd): undefined reference to `e_wsfe'
./libMobileNumeric.a(vode.o): In function `vode_':
vode.f:(.text+0x901): undefined reference to `s_copy'
vode.f:(.text+0x974): undefined reference to `s_copy'
vode.f:(.text+0x9c5): undefined reference to `s_copy'
./libMobileNumeric.a(vode.o): In function `.L124':
vode.f:(.text+0xbfc): undefined reference to `s_copy'
vode.f:(.text+0xc5a): undefined reference to `s_copy'
./libMobileNumeric.a(vode.o):vode.f:(.text+0xcc3): more undefined references
to `s_copy' follow
./libMoAlgebra.so: undefined reference to `s_cat'
collect2: ld returned 1 exit status



Und mit
g++ -Wall -g -o test test.o -I. -L. -lMobileNumeric -lMoAlgebra -lMobileCore -lEOT -lTinyXML

./libMobileCore.so: undefined reference to `lsodar_'
./libMobileCore.so: undefined reference to `srcar_'
./libMoAlgebra.so: undefined reference to `xerbla_'
./libMoAlgebra.so: undefined reference to `dscal_'
./libMobileCore.so: undefined reference to `hybrj_'
./libMobileCore.so: undefined reference to `dgetrs_'
./libMoAlgebra.so: undefined reference to `dswap_'
./libMoAlgebra.so: undefined reference to `e_wsfe'
./libMobileCore.so: undefined reference to `rpoly_'
./libMobileCore.so: undefined reference to `intdy_'
./libMobileCore.so: undefined reference to `hybrd_'
./libMobileCore.so: undefined reference to `dpptrs_'
./libMobileCore.so: undefined reference to `dspmv_'
./libMobileCore.so: undefined reference to `dcopy_'
./libMobileCore.so: undefined reference to `ode_'
./libMobileCore.so: undefined reference to `dpptrf_'
./libMoAlgebra.so: undefined reference to `ddot_'
./libMoAlgebra.so: undefined reference to `dgemm_'
./libMoAlgebra.so: undefined reference to `dtrsm_'
./libMoAlgebra.so: undefined reference to `do_fio'
./libMoAlgebra.so: undefined reference to `s_cat'
./libMobileCore.so: undefined reference to `dgetrf_'
./libMoAlgebra.so: undefined reference to `idamax_'
./libMoAlgebra.so: undefined reference to `ilaenv_'
./libMoAlgebra.so: undefined reference to `dger_'
./libMoAlgebra.so: undefined reference to `daxpy_'
./libMobileCore.so: undefined reference to `dpptri_'
./libMobileCore.so: undefined reference to `vode_'
./libMoAlgebra.so: undefined reference to `lsame_'
./libMoAlgebra.so: undefined reference to `s_wsfe'
collect2: ld returned 1 exit status


Nun frage ich mich, was das heisst. Kann es sein, dass sich die Libraries gegenseitig aufrufen und sich nicht finden, weil sie nach einander gelinkt werden?
Wenn ja, gibt es eine Möglichkeit sie so zu linken, dass sie sich gegenseitig finden?
Muss ich die Shared Libraries vielleicht noch 'installieren'? Den LD_LIBRARY_PATH habe ich entsprechend gesetzt.


Oder kann es sein, dass doch noch einen nicht Standard Library fehlt?
Dann wundert es mich aber, dass unterschiedliche Fehler bei unterschiedlichen Link Reihenfolgen gibt. Oder werden die späteren Libraries nicht mehr verlinkt, wenn bei den ersten Fehler auftreten?

SeeksTheMoon
26-01-2006, 08:31
Du musst natürlich die Bibliotheken und deren Header installiert haben. Dann müssen noch die includes im Code richtig sein, d.h. wenn Du irgendwo "A braucht B und B braucht A" hast, dann wird das etwas Bastelei.
Am besten ist es, wenn Du ein build-Tool nimmst und kein Script, das erkennt Abhängigkeiten, Modifizierungszeit usw.
Schau Dir mal GNU make, scons oder jam an.

Ferox
26-01-2006, 09:29
In die Standard Lib Verzeichnisse kann ich die Libraries auf meinem Rechner nicht installieren, weil ich keine Admin rechte habe.
Deshalb habe ich sie in meinem Projekt Verzeichniss gelassen und den Library Pfad dem gcc mit -L. mitgeteilt.
Das müsste doch so auch funktionieren, oder?
Ich meine, wenn er sie nicht finden würde, gäb es doch schon vorher eine Fehlermeldung beim Linken...

Den Code habe ich nicht selber geschrieben, da es ein Testprogramm der Firma ist, was bei denen läuft. Also wird es an den includes nicht liegen.

Ich werde es mal mit Make versuchen. Doch da ich nur einen .cpp Datei habe und kein ganzes Projekt macht es doch eigentlich keinen Unterschied zu einem Skript, oder?
Bei make muss ich doch genauso den gcc Aufruf von Hand angeben.

Ferox
26-01-2006, 10:32
Auch mit einem handgeschriebenen Makefile das selber Ergebniss.
Oder war das zu einfach gedacht?

irf: test.o
g++-3.3 -Wall -g -o test test.o -I. -L. -lMobileNumeric -lMoAlgebra -lMobileCore -lEOT -lTinyXML

test.o: test.cpp
g++-3.3 -Wall -g -c test.cpp -o test.o -I.

anda_skoa
26-01-2006, 14:00
Hängt die libs einfach danach nochmal an also


-lMobileNumeric -lMoAlgebra -lMobileCore -lEOT -lTinyXML -lMobileNumeric -lMoAlgebra -lMobileCore

Ciao,
_