How to set opengl up on linux manuelly (no ide) with clang?

Hi,

I have installed opengl with arch linus’s packages via AUR and pacman repos but still get linker errors trying to compile some examples like below:

$ clang -v dials.c 
clang version 22.1.2
Target: x86_64-pc-linux-gnu
Thread model: posix
InstalledDir: /usr/bin
Found candidate GCC installation: /usr/bin/../lib/gcc/x86_64-pc-linux-gnu/15.2.1
Found candidate GCC installation: /usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/15.2.1
Selected GCC installation: /usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/15.2.1
Candidate multilib: .;@m64
Candidate multilib: 32;@m32
Selected multilib: .;@m64
Found HIP installation: /opt/rocm, version 7.2.53211
 "/usr/bin/clang-22" -cc1 -triple x86_64-pc-linux-gnu -emit-obj -dumpdir a- -disable-free -clear-ast-before-backend -disable-llvm-verifier -discard-value-names -main-file-name dials.c -mrelocation-model pic -pic-level 2 -pic-is-pie -mframe-pointer=all -fmath-errno -ffp-contract=on -fno-rounding-math -mconstructor-aliases -funwind-tables=2 -target-cpu x86-64 -tune-cpu generic -debugger-tuning=gdb -fdebug-compilation-dir=/home/alek/Downloads/examples/examples -v -fcoverage-compilation-dir=/home/alek/Downloads/examples/examples -resource-dir /usr/lib/clang/22 -internal-isystem /usr/lib/clang/22/include -internal-isystem /usr/local/include -internal-isystem /usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/15.2.1/../../../../x86_64-pc-linux-gnu/include -internal-externc-isystem /include -internal-externc-isystem /usr/include -ferror-limit 19 -fmessage-length=190 -stack-protector 2 -fgnuc-version=4.2.1 -fskip-odr-check-in-gmf -fcolor-diagnostics -faddrsig -fdwarf2-cfi-asm -o /tmp/dials-08e501.o -x c dials.c
clang -cc1 version 22.1.2 based upon LLVM 22.1.2 default target x86_64-pc-linux-gnu
ignoring nonexistent directory "/usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/15.2.1/../../../../x86_64-pc-linux-gnu/include"
ignoring nonexistent directory "/include"
#include "..." search starts here:
#include <...> search starts here:
 /usr/lib/clang/22/include
 /usr/local/include
 /usr/include
End of search list.
 "/usr/bin/ld" --hash-style=gnu --build-id --eh-frame-hdr -m elf_x86_64 -pie -dynamic-linker /lib64/ld-linux-x86-64.so.2 -o a.out /usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/15.2.1/../../../../lib64/Scrt1.o /usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/15.2.1/../../../../lib64/crti.o /usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/15.2.1/crtbeginS.o -L/usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/15.2.1 -L/usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/15.2.1/../../../../lib64 -L/lib/../lib64 -L/usr/lib64 -L/lib -L/usr/lib /tmp/dials-08e501.o -lgcc --as-needed -lgcc_s --no-as-needed -lc -lgcc --as-needed -lgcc_s --no-as-needed /usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/15.2.1/crtendS.o /usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/15.2.1/../../../../lib64/crtn.o
/usr/bin/ld: /tmp/dials-08e501.o: in function `drawCircle':
dials.c:(.text+0x15): undefined reference to `glPushMatrix'
/usr/bin/ld: dials.c:(.text+0x27): undefined reference to `glTranslatef'
/usr/bin/ld: dials.c:(.text+0x31): undefined reference to `glBegin'
/usr/bin/ld: dials.c:(.text+0x3c): undefined reference to `glVertex2f'
/usr/bin/ld: dials.c:(.text+0x72): undefined reference to `cos'
/usr/bin/ld: dials.c:(.text+0x9f): undefined reference to `sin'
/usr/bin/ld: dials.c:(.text+0xb9): undefined reference to `glVertex2f'
/usr/bin/ld: dials.c:(.text+0xe1): undefined reference to `glEnd'
/usr/bin/ld: dials.c:(.text+0xf4): undefined reference to `glColor3f'
/usr/bin/ld: dials.c:(.text+0xfe): undefined reference to `glBegin'
/usr/bin/ld: dials.c:(.text+0x109): undefined reference to `glVertex2f'
/usr/bin/ld: dials.c:(.text+0x135): undefined reference to `cos'
/usr/bin/ld: dials.c:(.text+0x176): undefined reference to `sin'
/usr/bin/ld: dials.c:(.text+0x190): undefined reference to `glVertex2f'
/usr/bin/ld: dials.c:(.text+0x195): undefined reference to `glEnd'
/usr/bin/ld: dials.c:(.text+0x19a): undefined reference to `glPopMatrix'
/usr/bin/ld: /tmp/dials-08e501.o: in function `displayDials':
dials.c:(.text+0x1be): undefined reference to `glClear'
/usr/bin/ld: dials.c:(.text+0x1e3): undefined reference to `glColor3f'
/usr/bin/ld: dials.c:(.text+0x232): undefined reference to `glutSwapBuffers'
/usr/bin/ld: /tmp/dials-08e501.o: in function `displayButtons':
dials.c:(.text+0x24e): undefined reference to `glClear'
/usr/bin/ld: dials.c:(.text+0x258): undefined reference to `glBegin'
/usr/bin/ld: dials.c:(.text+0x2bd): undefined reference to `glColor3f'
/usr/bin/ld: dials.c:(.text+0x2d2): undefined reference to `glColor3f'
/usr/bin/ld: dials.c:(.text+0x301): undefined reference to `glVertex2f'
/usr/bin/ld: dials.c:(.text+0x330): undefined reference to `glVertex2f'
/usr/bin/ld: dials.c:(.text+0x35f): undefined reference to `glVertex2f'
/usr/bin/ld: dials.c:(.text+0x38e): undefined reference to `glVertex2f'
/usr/bin/ld: dials.c:(.text+0x3aa): undefined reference to `glEnd'
/usr/bin/ld: dials.c:(.text+0x3af): undefined reference to `glutSwapBuffers'
/usr/bin/ld: /tmp/dials-08e501.o: in function `reshape':
dials.c:(.text+0x3d9): undefined reference to `glViewport'
/usr/bin/ld: dials.c:(.text+0x3e3): undefined reference to `glMatrixMode'
/usr/bin/ld: dials.c:(.text+0x3e8): undefined reference to `glLoadIdentity'
/usr/bin/ld: dials.c:(.text+0x3fd): undefined reference to `gluOrtho2D'
/usr/bin/ld: dials.c:(.text+0x402): undefined reference to `glutGetWindow'
/usr/bin/ld: dials.c:(.text+0x422): undefined reference to `glScalef'
/usr/bin/ld: dials.c:(.text+0x436): undefined reference to `glTranslatef'
/usr/bin/ld: dials.c:(.text+0x440): undefined reference to `glMatrixMode'
/usr/bin/ld: /tmp/dials-08e501.o: in function `dodial':
dials.c:(.text+0x483): undefined reference to `glutSetWindow'
/usr/bin/ld: dials.c:(.text+0x488): undefined reference to `glutPostRedisplay'
/usr/bin/ld: /tmp/dials-08e501.o: in function `dobutton':
dials.c:(.text+0x4df): undefined reference to `glutSetWindow'
/usr/bin/ld: dials.c:(.text+0x4e4): undefined reference to `glutPostRedisplay'
/usr/bin/ld: /tmp/dials-08e501.o: in function `main':
dials.c:(.text+0x51c): undefined reference to `glutInit'
/usr/bin/ld: dials.c:(.text+0x526): undefined reference to `glutDeviceGet'
/usr/bin/ld: dials.c:(.text+0x561): undefined reference to `glutDeviceGet'
/usr/bin/ld: dials.c:(.text+0x5a4): undefined reference to `glutInitDisplayMode'
/usr/bin/ld: dials.c:(.text+0x5cb): undefined reference to `glutInitWindowSize'
/usr/bin/ld: dials.c:(.text+0x5d7): undefined reference to `glutCreateWindow'
/usr/bin/ld: dials.c:(.text+0x602): undefined reference to `glClearColor'
/usr/bin/ld: dials.c:(.text+0x60f): undefined reference to `glLineWidth'
/usr/bin/ld: dials.c:(.text+0x61f): undefined reference to `glutDialsFunc'
/usr/bin/ld: dials.c:(.text+0x62f): undefined reference to `glutButtonBoxFunc'
/usr/bin/ld: dials.c:(.text+0x63b): undefined reference to `glutDisplayFunc'
/usr/bin/ld: dials.c:(.text+0x64b): undefined reference to `glutReshapeFunc'
/usr/bin/ld: dials.c:(.text+0x657): undefined reference to `glutInitWindowSize'
/usr/bin/ld: dials.c:(.text+0x663): undefined reference to `glutCreateWindow'
/usr/bin/ld: dials.c:(.text+0x67e): undefined reference to `glClearColor'
/usr/bin/ld: dials.c:(.text+0x68a): undefined reference to `glutDisplayFunc'
/usr/bin/ld: dials.c:(.text+0x693): undefined reference to `glutReshapeFunc'
/usr/bin/ld: dials.c:(.text+0x69c): undefined reference to `glutDialsFunc'
/usr/bin/ld: dials.c:(.text+0x6a5): undefined reference to `glutButtonBoxFunc'
/usr/bin/ld: dials.c:(.text+0x6aa): undefined reference to `glutMainLoop'
clang: error: linker command failed with exit code 1 (use -v to see invocation)

You’re not linking to libGL.so. Try adding -lGL.

ehm?

$ clang -lGL -v blender.c
clang version 22.1.2
Target: x86_64-pc-linux-gnu
Thread model: posix
InstalledDir: /usr/bin
Found candidate GCC installation: /usr/bin/../lib/gcc/x86_64-pc-linux-gnu/15.2.1
Found candidate GCC installation: /usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/15.2.1
Selected GCC installation: /usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/15.2.1
Candidate multilib: .;@m64
Candidate multilib: 32;@m32
Selected multilib: .;@m64
Found HIP installation: /opt/rocm, version 7.2.53211
 "/usr/bin/clang-22" -cc1 -triple x86_64-pc-linux-gnu -emit-obj -dumpdir a- -disable-free -clear-ast-before-backend -disable-llvm-verifier -discard-value-names -main-file-name blender.c -mrelocation-model pic -pic-level 2 -pic-is-pie -mframe-pointer=all -fmath-errno -ffp-contract=on -fno-rounding-math -mconstructor-aliases -funwind-tables=2 -target-cpu x86-64 -tune-cpu generic -debugger-tuning=gdb -fdebug-compilation-dir=/home/alek/Downloads/examples/examples -v -fcoverage-compilation-dir=/home/alek/Downloads/examples/examples -resource-dir /usr/lib/clang/22 -internal-isystem /usr/lib/clang/22/include -internal-isystem /usr/local/include -internal-isystem /usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/15.2.1/../../../../x86_64-pc-linux-gnu/include -internal-externc-isystem /include -internal-externc-isystem /usr/include -ferror-limit 19 -fmessage-length=80 -stack-protector 2 -fgnuc-version=4.2.1 -fskip-odr-check-in-gmf -fcolor-diagnostics -faddrsig -fdwarf2-cfi-asm -o /tmp/blender-b39a1c.o -x c blender.c
clang -cc1 version 22.1.2 based upon LLVM 22.1.2 default target x86_64-pc-linux-gnu
ignoring nonexistent directory "/usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/15.2.1/../../../../x86_64-pc-linux-gnu/include"
ignoring nonexistent directory "/include"
#include "..." search starts here:
#include <...> search starts here:
 /usr/lib/clang/22/include
 /usr/local/include
 /usr/include
End of search list.
 "/usr/bin/ld" --hash-style=gnu --build-id --eh-frame-hdr -m elf_x86_64 -pie -dynamic-linker /lib64/ld-linux-x86-64.so.2 -o a.out /usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/15.2.1/../../../../lib64/Scrt1.o /usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/15.2.1/../../../../lib64/crti.o /usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/15.2.1/crtbeginS.o -L/usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/15.2.1 -L/usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/15.2.1/../../../../lib64 -L/lib/../lib64 -L/usr/lib64 -L/lib -L/usr/lib -lGL /tmp/blender-b39a1c.o -lgcc --as-needed -lgcc_s --no-as-needed -lc -lgcc --as-needed -lgcc_s --no-as-needed /usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/15.2.1/crtendS.o /usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/15.2.1/../../../../lib64/crtn.o
/usr/bin/ld: /tmp/blender-b39a1c.o: in function `output':
blender.c:(.text+0x48): undefined reference to `glutStrokeRoman'
/usr/bin/ld: blender.c:(.text+0x4d): undefined reference to `glutStrokeCharacter'
/usr/bin/ld: /tmp/blender-b39a1c.o: in function `display':
blender.c:(.text+0x9f): undefined reference to `cos'
/usr/bin/ld: blender.c:(.text+0x179): undefined reference to `cos'
/usr/bin/ld: blender.c:(.text+0x263): undefined reference to `gluOrtho2D'
/usr/bin/ld: blender.c:(.text+0x306): undefined reference to `glutSwapBuffers'
/usr/bin/ld: /tmp/blender-b39a1c.o: in function `idle':
blender.c:(.text+0x335): undefined reference to `fmod'
/usr/bin/ld: blender.c:(.text+0x366): undefined reference to `fmod'
/usr/bin/ld: blender.c:(.text+0x39b): undefined reference to `glutPostRedisplay'
/usr/bin/ld: /tmp/blender-b39a1c.o: in function `visible':
blender.c:(.text+0x3c9): undefined reference to `glutIdleFunc'
/usr/bin/ld: blender.c:(.text+0x3d4): undefined reference to `glutIdleFunc'
/usr/bin/ld: /tmp/blender-b39a1c.o: in function `main':
blender.c:(.text+0x40c): undefined reference to `glutInit'
/usr/bin/ld: blender.c:(.text+0x416): undefined reference to `glutInitDisplayMode'
/usr/bin/ld: blender.c:(.text+0x422): undefined reference to `glutCreateWindow'
/usr/bin/ld: blender.c:(.text+0x42e): undefined reference to `glutDisplayFunc'
/usr/bin/ld: blender.c:(.text+0x43a): undefined reference to `glutVisibilityFunc'
/usr/bin/ld: blender.c:(.text+0x44e): undefined reference to `glutSolidIcosahedron'
/usr/bin/ld: blender.c:(.text+0x55f): undefined reference to `gluPerspective'
/usr/bin/ld: blender.c:(.text+0x597): undefined reference to `gluLookAt'
/usr/bin/ld: blender.c:(.text+0x5b4): undefined reference to `glutMainLoop'
clang: error: linker command failed with exit code 1 (use -v to see invocation)

You need -lglut for that one.