2013-07-19 7 views
6

Quando si collega un progetto cui sto lavorando, il linker dà i seguenti errori:indefinito riferimento al simbolo, anche se la libreria è legata

/usr/bin/ld: ../Includes and Libs/lib/libsfml21rca.a(SoundFile.o): undefined reference to symbol '[email protected]@libsndfile.so.1.0' 

/usr/bin/ld: note: '[email protected]@libsndfile.so.1.0' is defined in DSO /usr/lib/gcc/i686-linux-gnu/4.6/../../../i386-linux-gnu/libsndfile.so so try adding it to the linker command line 

/usr/lib/gcc/i686-linux-gnu/4.6/../../../i386-linux-gnu/libsndfile.so: could not read symbols: Invalid operation 

Il fatto è che, libsndfile.so sia già collegato prima libsfml21rca. a, quindi non ho idea di dove sia il problema.

sto usando Code :: Blocks 10,05

Grazie per l'aiuto in anticipo

EDIT:

Ecco il comando di collegamento:

g ++ -L" Include e Libs/lib "-L" Include e Libs/lib/raknet3_731 "-L" Include e Libs/lib/d3d_new/x86 "-L" Include e Libs/lib/ogg "-L" Include e Libs/lib/ogg/sdl "-LBullet/lib -o (nome file) ... (un sacco di file oggetto) -lGLEW -lglfw -lGL -lGLU -lpthread -lopenal -ljpeg -lfreetype -lsndfile -lXrandr -lsfml-system -lsfml-window -lsfml-audio ../Bullet /lib/LinearMath.lib ../Bullet/lib/BulletCollision.lib ../Bullet/lib/BulletDynamics.lib "../Include e Libs/lib/raknet3_731/RakNetLibStaticDebug.lib" "../Include e Libs/lib/libsfml21rca.a "../../../../../../home/msabol/Desktop/SFML/sfml2st/sfmlVideo/sfmlVideo/bin/Release/libsfmlVideo.a ../ .. /../../../../home/msabol/Desktop/SFML/sfmlVideo/bin/Release/libsfmlVideo.a

+4

provare a cambiare l'ordine di collegamento? –

+0

Come esattamente dovrei cambiarlo? Tutto è collegato nell'ordine corretto, o almeno sembra così. – Matuzalem

+0

Aggiungere il comando che C :: B sta utilizzando per collegare alla domanda. (non aggiungerlo come commento!) – greatwolf

risposta

5

Il linker viene eseguito un solo passaggio sopra i file di libreria. Quindi se hai qualcosa nella Libreria A che ha bisogno di qualcosa nella Libreria B, devi avere g++ objects... -llibA -llibB, se usi g++ objects... -llibB -llibA fallirà nel modo in cui mostri.

Quindi, nel tuo caso, inserisci -lsndfile dopo il "../Includes and Libs/lib/libsfml21rca.a".

(E di chi è stata l'idea di mettere spazi in un il "Include e movimenti di liberazione" directory - non l'idea migliore che ho visto ...)

+1

Farò un tentativo. In mia difesa, ho saltato su questo progetto pochi giorni fa, quindi tutti i nomi terribili (ce ne sono altri) non sono stati creati da me. ** MODIFICA: ** Dannazione, ha funzionato! Grazie, Mats Peterson. – Matuzalem

+0

@Mat francamente, trovo il passaggio singolo su libreria più scoraggiante. Ci sono state innumerevoli domande su SO come gli OP a causa della limitazione di 'ld' linker. Lo strumento 'LINK' di Microsoft non presenta questo problema, ad esempio. Nemmeno l'ilinker di Embarcadero. – greatwolf

+0

@greatwolf Sfortunatamente, il mio compito è far funzionare il progetto su piattaforme Unix. Tanto per Microsoft "LINK". – Matuzalem