4

TL;博士:

我如何从拥有 DerelictGL3 等的源代码到使用 GDC 链接到它?

详细投诉:

我有一个用 D 编写的小程序。(http://dlang.org

module controller;

import std.stdio;
import std.conv;
import std.exception;
import derelict.opengl3.gl3;
import derelict.glfw3.glfw3;

void main()
{
    DerelictGL3.load();
    DerelictGLFW3.load();

    if(!glfwInit())
        throw new Exception("Failure");
    scope(exit) glfwTerminate();
}

我正在尝试使用以下命令构建该程序。(我在Linux上。)

gdc -o "${BLD}controller" \
    "/home/user/Source/d/controller.d" \
    "-I/home/user/Source/DerelictOrg/DerelictUtil/source/" \
    "-I/home/user/Source/DerelictOrg/DerelictGL3/source/" \
    "-I/home/user/Source/DerelictOrg/DerelictGLFW3/source/" \
    -I/usr/include/d2 \
    -L -lDerelictUtil \
    -L -lDerelictGL3 \
    -L -lDerelictGLFW3 \
    -L -ldl

我收到以下错误消息。

controller.d:(.text+0x3b): undefined reference to 
  `_D8derelict7opengl33gl311DerelictGL3C8derelict7opengl33gl317DerelictGL3Loader'
controller.d:(.text+0x4c): undefined reference to 
  `_D8derelict7opengl33gl311DerelictGL3C8derelict7opengl33gl317DerelictGL3Loader'
controller.d:(.text+0x58): undefined reference to 
  `_D8derelict5glfw35glfw313DerelictGLFW3C8derelict5glfw35glfw319DerelictGLFW3Loader'
controller.d:(.text+0x69): undefined reference to 
  `_D8derelict5glfw35glfw313DerelictGLFW3C8derelict5glfw35glfw319DerelictGLFW3Loader'
controller.d:(.text+0x75): undefined reference to 
  `_D8derelict5glfw35glfw38glfwInitPUNbZi'
controller.d:(.text+0xf7): undefined reference to 
  `_D8derelict5glfw35glfw313glfwTerminatePUNbZv'
/tmp/ccTqE9NN.o:(.data+0x28): undefined reference to 
  `_D8derelict7opengl33gl312__ModuleInfoZ'
/tmp/ccTqE9NN.o:(.data+0x30): undefined reference to 
  `_D8derelict5glfw35glfw312__ModuleInfoZ'
collect2: error: ld returned 1 exit status

我相当确定我传递给 GDC 的所有参数都不是正确的,超出了我的源文件的名称。如果我注释掉所有 -L 行,行为是相同的。如果我注释掉 -I 行,我会得到以下信息。

controller.d:6: error: module gl3 is in file 'derelict/opengl3/gl3.d' 
    which cannot be read

但是,我希望可以通过一个放置良好的库来解决这个问题。

我如何从拥有 DerelictGL3 等的源代码到使用 GDC 链接到它?

编辑: 我确信我已经在 /usr/bin/ 中安装了 libDerelictGL3.a、libDerelictGLFW3.a 和 libDerelictUtil.a。

更多想法: 我真的很困惑为什么我需要针对源代码进行编译。这不是 C++,也没有头文件。当我放弃 -I 行时,编译器不知道如何打开 gl3 模块。它不应该只是推断我使用的函数存在,然后如果/当它找不到它们时会出现链接器错误?鉴于我已经编译了库并在搜索路径中,为什么 GDC 不能弄清楚其余部分?

更多想法: 我最近发现Can't link GLFW3: undefined references 在这种情况下,OP 发现他们需要 .so 形式的库,而不是 .a 形式,因为他们正在尝试动态链接。我目前正在对此进行调查。

另一个难题: 我已将 gdc 调用的相关部分更改为

-I/usr/include/d2 \
-L -ldl \
-L/usr/bin \
-lDerelictUtil \
-lDerelictGL3 \
-lDerelictGLFW3

现在,我似乎在链接到 _d_runtime 本身时遇到了问题,而不是在链接到 Derelict 时遇到了麻烦。

输出是类似于这些的数百行:

/usr/bin/libDerelictGL3.a(libDerelictGL3.o): In function
  `_D3std5array18__T8AppenderTAPxaZ8Appender13ensureAddableMFNaNbNfmZv':
/home/user/Source/ldc-developers/ldc/runtime/phobos/std/array.d:2231:
  undefined reference to `_d_allocmemoryT'

因此,我认为我的问题是 _d_runtime(如果名称错误,请原谅我)在 /usr/bin 以外的某个地方,并且当我将 -L 路径覆盖到 /usr/bin 时(因为那是我放置库的地方)我很难找到它。要么是这样,要么我只是首先安装了 D 错误。但无论哪种情况,它实际上都是在上述示例中找到 libDerelictGL3.a !=)

4

1 回答 1

1

编辑:我想我省略了使用 gdc 构建 Derelict 的实际行。

dub --compiler=gdc

我在每个废弃包的源目录中执行此操作,并将 lib/ 的内容复制到 /usr/bin。


我已经想通了。是时候对“下一个人”进行彻底的后现代了。

我前段时间开始了这个项目,我忘记了我开始使用 ldc,一个基于 llvm 的 D 编译器。出于某种原因,我将 /usr/bin/dmd2 符号链接到 ldmd2 的本地构建,作为源目录中的新二进制文件。我构建的各种 DerelictOrg 项目使用 dub,然后使用 ldmd2,因此是 d 运行时的本地(可能是 fork)副本。

基本上,项目的其余部分设置正确。为了下一个人,我的脚本最终是这样的:

gdc -o "/home/user/Build/controller" \
  "/home/user/Source/d/controller.d" \
  -I/usr/include/d \
  "-I/home/user/Source/DerelictOrg/DerelictUtil/source/" \
  "-I/home/user/Source/DerelictOrg/DerelictGL3/source/" \
  "-I/home/user/Source/DerelictOrg/DerelictGLFW3/source/" \
  -lDerelictUtil \
  -lDerelictGL3 \
  -lDerelictGLFW3 \
  -ldl

幽默的是,ldc vs gdc 的错误一直到我在这里发布的日志中。太糟糕了,我没有足够仔细地阅读自己的日志。

于 2014-11-04T02:44:02.587 回答