openGL程序无法与LDC链接

时间:2013-02-16 05:18:27

标签: opengl linker d

我正在尝试使用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

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符号非常简单,只包含名称后面的前导下划线。