Problem vid kompilering av enkelt OpenGL-program

Permalänk

Problem vid kompilering av enkelt OpenGL-program

Problemet är löst. Se nedan.

Jag försöker kompilera en enkel OpenGL-testfil, men misslyckas hela tiden med länkningen.

Min fil ser ut så här:

#include <GL/glut.h> int main(int argc, char **argv){ glutInit(&argc, argv); return 0; }

Dessa kommandon har jag använt för att försöka kompilera:

"gcc -ansi -Wall test.c"

/tmp/ccgYmUr1.o(.text+0x2a): In function `main': : undefined reference to `glutInit' collect2: ld returned 1 exit status

"gcc -ansi -lglut -Wall test.c"

/usr/bin/ld: cannot find -lglut collect2: ld returned 1 exit status

"gcc -L /usr/X11R6/lib -lglut -ansi -Wall test.c"

Massor av "undefined reference"

"gcc -L /usr/X11R6/lib -lGL -lGLU -lglut -Wall -ansi test.c"

/usr/X11R6/lib/libglut.so: undefined reference to `XGetExtensionVersion' /usr/X11R6/lib/libglut.so: undefined reference to `XFreeDeviceList' /usr/X11R6/lib/libglut.so: undefined reference to `XQueryDeviceState' /usr/X11R6/lib/libglut.so: undefined reference to `XListInputDevices' /usr/X11R6/lib/libglut.so: undefined reference to `XFreeDeviceState' /usr/X11R6/lib/libglut.so: undefined reference to `XOpenDevice' /usr/X11R6/lib/libglut.so: undefined reference to `XmuLookupStandardColormap' /usr/X11R6/lib/libglut.so: undefined reference to `XSelectExtensionEvent' collect2: ld returned 1 exit status

Jag kör Arch Linux och har installerat glut 3.7-4. Som jag har förstått det kallas detta statisk länkning, och problemet är att ytterligare ett bibliotek skall inkluderas. Borde länkaren inte själv kunna hitta det den behöver?

Varför blir det så här? Är det en bättre idé att länka dynamiskt och hur gör man i så fall det?

Lösningen:
Jag letade upp alla saknade symboler med detta program:

nm -Bog /usr/X11/lib/* | grep SaknadSymbol

Sedan inkluderade jag dem i kommandot och fick slutligen detta:

gcc -L /usr/X11R6/lib -lGL -lGLU -lglut -lXi -lXmu -Wall -ansi test.c

Frågan om huruvida detta är statisk eller dynamisk länkning återstår, och det skulle vara trevligt med ett smidigare sätt att göra detta. Finns ingen miljövariabel man kan använda för den långa sökvägen?

Permalänk
Medlem

Du kan enkelt ta reda på huruvida statisk eller dynamisk länkning skett. Jag tror kommandot är ldd även i Linux (är det i alla fall i BSD). Alla de libraries den listar där är dynamiskt länkade. Att du får felmeddelanden angående "libglut.so" tyder på att det är dynamisk länkning (.so = "shared object", statiska bibliotek heter .a för "archive").

Om du tycker att kommandoraden börjar bli lite väl lång kanske du ska kika på att skapa en Makefile, som innehåller alla kompilatorflaggor så du slipper skriva om dem hela tiden. Mig veterligen finns det inga envvariabler som gcc läser för de inställningarna annars.