1

我正在尝试用 ldc 用 D 语言编译一个简单的程序,但它似乎无法与 openGL 链接。

铿锵声工作正常:

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

命令行

$ 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
4

1 回答 1

2

你是如何声明 OpenGL 函数的?__D2gl10glVertex3fFfffZv是符号gl.glVertex3f,是模块中的一个D符号gl

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

于 2013-02-16T09:40:04.830 回答