2016-06-10 14 views
0

Ich schreibe ein Hybridprogramm in Cpp + X86-Assembly. Das Projekt besteht aus 3 Dateien: main.cc, data.cc und a_t.asm. Ich bin mit einem Makefile (in dem ich ein absoluter Anfänger bin) fest. Es sieht wie folgt aus:Kann OpenGL-Bibliotheken nicht in Makefile verknüpfen

CC=gcc 
ASMBIN=nasm 
CFLAGS=-m32 -Wall 

all: main.o a_t.o 
    $(CC) -m32 main.o a_t.o -lGL -lGLU -lglut 

a_t.o: 
    $(ASMBIN) -f elf a_t.asm 

main.o: main.cc data.cc 
    $(CC) $(CFLAGS) -g main.cc 

clean: 
    rm -rf *o main 

auf Befehl make ich folgendes erhalten:

gcc -m32 main.o a_t.o -lGL -lGLU -lglut 
/usr/bin/ld: cannot find -lGL 
/usr/bin/ld: cannot find -lGLU 
/usr/bin/ld: cannot find -lglut 
collect2: error: ld returned 1 exit status 
make: *** [all] Error 1 

Ich habe versucht "-lGL -lGLU -lglut" Teil in unterschiedlicher Reihenfolge setzen, aber nichts gearbeitet haben. Ich habe alle drei Bibliotheken installiert und funktioniert. Ich würde Ihre Hilfe zu schätzen wissen.

+2

Verwendet Ihr Code tatsächlich Funktionen in diesen Bibliotheken? Sieht für mich so aus, als hättest du einfach nur die Laufzeit-Bibliotheken installiert, aber nicht die Header-Dateien und die Link-Bibliotheken. Es ist nichts falsch mit Ihrem Makefile. –

+0

Ja, tut es. Sieht so aus, als würde es nicht richtig funktionieren, wenn ich eine -m32-Markierung hinzufüge. –

+0

Das bedeutet also, dass Sie die 32-Bit-Bibliotheken nicht installiert haben. –

Antwort

0

Makefiles können ein bisschen geheimnisvoll sein, etwas pingelig, um richtig zu werden, und es gibt eine Menge Voodoo, die darüber schweben, wie man sie schreibt. Hier ist eine vernünftige, Fest-up Make-Datei:

# Don't set CC=gcc, because it's not 1995 any more. 
ASMBIN = nasm 
# CFLAGS is for C, CXXFLAGS is for C++ 
# Also, let's put -g here 
CXXFLAGS = -m32 -Wall -g 
LDFLAGS = -m32 

# Use pkg-config wherever possible 
opengl_libs := -lglut $(shell pkg-config --libs gl glu) 
opengl_cflags := $(shell pkg-config --cflags gl glu) 

all: main 

main: main.o a_t.o 
    # Order of flags is important here! 
    # We also have to use CXX instead of CC to avoid linker errors. 
    $(CXX) $(LDFLAGS) -o [email protected] $^ $(opengl_libs) 

a_t.o: 
    $(ASMBIN) -f elf a_t.asm 

main.o: main.cc data.cc 
    # Don't forget -c and -o 
    $(CXX) $(CXXFLAGS) $(opengl_cflags) -c $< -o [email protected] 

clean: 
    # Should be *.o, not *o 
    rm -rf *.o main 

.PHONY: all clean 

Dies ist jedoch wahrscheinlich nicht beheben, welchen Fehler Sie in ausgeführt werden. Sie müssen daran denken, die Entwicklungsversion der OpenGL-Bibliotheken zu installieren. Auf Debian-basierten Systemen, würde dies bedeuten, die folgenden Pakete (für i386, natürlich) zu installieren:

  • libglu1-mesa-dev
  • libgl1-mesa-dev
  • freeglut3-dev.

Das Programm pkg-config ist wahrscheinlich bereits installiert.

+0

Vielen Dank für eine ausführliche Antwort. Leider besteht das Problem immer noch. Ich habe alle von Ihnen angegebenen Bibliotheken installiert und überprüft. Außerdem habe ich festgestellt, dass es nur fehlschlägt, wenn ich -m32-Flag verwende, was ich nicht wirklich vermeiden kann. –

+0

@GregoryZaika: Haben Sie speziell die i386-Version der Pakete installiert? Es klingt, als hättest du nicht ... –

+0

O mein, ich habe diesen Teil in Klammern über i386 komplett übersehen. Mein Schlechter, hätte es viel früher bekommen können. –

0

Also das Problem war, dass die Verwendung von -m32 Flag 32-Bit-Bibliotheken benötigt. Da beide Personen, denen ich sehr dankbar bin, die mir geantwortet haben, ich hätte die Bibliotheken installieren sollen, nur die 32-Bit-Versionen von ihnen.

libglu1-mesa-dev:i386 
libgl1-mesa-dev:i386 
freeglut3-dev:i386 

Für diejenigen, die diese Antwort nutzen kann, bedenken Sie, dass die von i386-Paket installieren, entfernt amd64, und vice versa. Also vergessen Sie nicht, diese Pakete mit einem :amd64 Spezifizierer neu zu installieren.

Verwandte Themen