1

ldcでD言語の簡単なプログラムをコンパイルしようとしているのですが、openGLと連携できないようです。

clang は正常に動作します:

clang `pkg-config --cflags --libs glu gl libglfw` triangle.c 

LDC情報

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

extern(C)ライブラリ内のOpenGL関数には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 に答える