我正在尝试使用ldc在D语言中编译一个简单的程序,但它 似乎它无法与openGL链接。
clang工作正常:
clang `pkg-config --cflags --libs glu gl libglfw` triangle.c
最不发达国家信息
LDC - the LLVM D compiler (trunk):
based on DMD v2.060 and LLVM 3.2svn
Default target: x86_64-apple-darwin12.2.1
和pkg-config的结果
pkg-config --cflags --libs glu gl libglfw
-I/usr/local/include -I/opt/X11/include -L/usr/local/lib -L/opt/X11/lib -framework Cocoa -framework OpenGL -framework IOKit -lGLU -lGL -lglfw
的CommandLine
$ ldc2 -L-lglfw -L-L/opt/X11/lib -L-lGL -L-lGLU -w triangle.d
Undefined symbols for architecture x86_64:
"__D2gl10glVertex3fFfffZv", referenced from:
__Dmain in triangle.o
"__D2gl10glViewportFiiiiZv", referenced from:
__Dmain in triangle.o
"__D2gl12glClearColorFffffZv", referenced from:
__Dmain in triangle.o
"__D2gl12glMatrixModeFkZv", referenced from:
__Dmain in triangle.o
"__D2gl12glTranslatefFfffZv", referenced from:
__Dmain in triangle.o
"__D2gl14glLoadIdentityFZv", referenced from:
__Dmain in triangle.o
"__D2gl5glEndFZv", referenced from:
__Dmain in triangle.o
"__D2gl7glBeginFkZv", referenced from:
__Dmain in triangle.o
"__D2gl7glClearFkZv", referenced from:
__Dmain in triangle.o
"__D2gl9glColor3fFfffZv", referenced from:
__Dmain in triangle.o
"__D2gl9glRotatefFffffZv", referenced from:
__Dmain in triangle.o
"__D3glu14gluPerspectiveFddddZv", referenced from:
__Dmain in triangle.o
"__D3glu9gluLookAtFdddddddddZv", referenced from:
__Dmain in triangle.o
ld: symbol(s) not found for architecture x86_64
collect2: ld returned 1 exit status
Error: /usr/bin/gcc failed with status: 1
答案 0 :(得分:2)
您如何宣布OpenGL功能? __D2gl10glVertex3fFfffZv
是符号gl.glVertex3f
,它是模块gl
中的D符号。
libs中的OpenGL函数具有C链接,因此在声明它们时需要使用extern(C)
,例如。
extern(C) void glVertex3f(float, float, float);
如果您在文件中包含所有声明,那么您也可以使用{}
表示法:
extern(C)
{
void glVertex3f(float, float, float);
...
}
尝试修复链接器错误时,有时可以帮助查看要链接的符号。您可以将nm
实用程序与grep
一起使用来查找符号的损坏情况:
% nm /System/Library/Frameworks/OpenGL.framework/Libraries/libGL.dylib | grep glVertex3f
0000000000003b13 T _glVertex3f
0000000000003b2e T _glVertex3fv
如您所见,符号拼写为_glVertex3f
,而不是__D2gl10glVertex3fFfffZv
,这就是无法找到的原因。您可以通过前导__D
告诉您的是D符号以及所有额外的重整信息(例如,末尾的fff
表示3个float
参数)。通常,您在大多数库中找到的C符号非常简单,只包含名称后面的前导下划线。