【问题标题】:openGL program fails to link with LDCopenGL 程序无法与 LDC 链接
【发布时间】:2013-02-16 05:18:27
【问题描述】:

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

命令行

$ 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

【问题讨论】:

    标签: opengl linker d


    【解决方案1】:

    您如何声明 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 以及所有额外的修饰信息(例如,末尾的 fff 表示 3 个 float 参数)来判断您的是 D 符号。通常,您在大多数库中找到的 C 符号都非常简单,仅包含名称后面的前导下划线。

    【讨论】:

    • 非常感谢!我发现我添加了条件编译版本(OSX){extern(C):}但它不起作用......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-20
    相关资源
    最近更新 更多