2013-07-19 3 views
6

Wenn ein Projekt verknüpft arbeite ich an, gibt der Linker die folgenden Fehler:undefiniert Bezug auf Symbol, obwohl die Bibliothek verknüpft ist

/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 

Die Sache ist, libsndfile.so bereits vor libsfml21rca verbunden ist. a, also habe ich keine Ahnung wo das Problem liegt.

Ich bin mit Code :: Blocks 10.05

Vielen Dank für Hilfe im Voraus

EDIT:

Hier ist die Verknüpfung Befehl:

g ++ -L“ Includes und Libs/lib "-L" Includes und Libs/lib/raknet3_731 "-L" Includes und Libs/lib/d3d_new/x86 "-L" Includes und Libs/lib/ogg "-L" Includes und Libs/lib/sdl "-LBullet/lib -o (Dateiname) ... (eine ganze Reihe von Objektdateien) -lGLEW -lglfw -lGL -lGLU -lpthread -lopenal -ljpeg -lrequote -lsndfile -lXrandr -lsfml-system -lsfml-window -lsfml-audio ../Bullet /lib/LinearMath.lib ../Bullet/lib/BulletCollision.lib ../Bullet/lib/BulletDynamics.lib "../Includes und Libs/lib/raknet3_731/RakNetLibStaticDebug.lib" "../Includes und 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

Versuchen Sie, die Reihenfolge zu ändern Verknüpfung? –

+0

Wie genau soll ich das ändern? Alles ist in der richtigen Reihenfolge verknüpft, zumindest scheint es so. – Matuzalem

+0

Fügen Sie den Befehl C :: B zum Verlinken Ihrer Frage hinzu. (nicht als Kommentar hinzufügen!) – greatwolf

Antwort

5

Der Linker läuft nur einen Durchlauf über die Bibliotheksdateien. Wenn Sie also etwas in Bibliothek A haben, das etwas in Bibliothek B benötigt, müssen Sie g++ objects... -llibA -llibB haben, wenn Sie g++ objects... -llibB -llibA verwenden, wird es in der von Ihnen angezeigten Weise fehlschlagen.

Also, in Ihrem Fall, setzen Sie die -lsndfile nach "../Includes and Libs/lib/libsfml21rca.a".

(Und wessen Idee war es, Räume in einem der „Includes und Libs“ Verzeichnis zu setzen - nicht die beste Idee, die ich je gesehen habe ...)

+1

Ich werde es versuchen. Zu meiner Verteidigung habe ich vor ein paar Tagen auf dieses Projekt gesprungen, also wurden all die schrecklichen Namen (es gibt mehr davon) nicht von mir gemacht. ** EDIT: ** Verdammte Verdammnis, es hat funktioniert! Danke, Mats Peterson. – Matuzalem

+0

@Mats ehrlich gesagt finde ich die Single-Pass-over-Bibliothek mehr abstoßend. Es gab unzählige SO-Fragen wie die OP's wegen der 'ld'-Linker-Limitierung. Das "LINK" -Tool von Microsoft hat dieses Problem beispielsweise nicht. Weder macht Embarcadero's ilinker. – greatwolf

+0

@greatwolf Leider ist es meine Aufgabe, das Projekt auf Unix-Plattformen laufen zu lassen. So viel zu Microsofts "LINK". – Matuzalem