d-使用GDC链接到DerelictGL3



TL;DR:

我如何从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和libDereliteUtil.a。

更多想法:我真的很困惑为什么我需要根据源代码进行编译。这不是C++,也没有头文件。当我放弃-I行时,编译器不知道如何打开gl3模块。难道它不应该只是推断我使用的函数存在,然后在找不到它们的情况下出现链接器错误吗?既然我已经编译了库并在搜索路径中,为什么GDC不能解决其余问题?

更多想法:我最近发现Can';t链接GLFW3:未定义的引用在这种情况下,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(因为那是我放置libs的地方)时,我很难找到它。要么是这样,要么就是我一开始就安装错了d。但在任何一种情况下,它实际上都是在前面提到的示例中找到libDerelictGL3.a!=)

Edit:我想我遗漏了用gdc构建Derelict的实际行。

dub --compiler=gdc

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


我已经想通了。是时候彻底的后现代主义"为下一个家伙"。

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

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

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与gdc的错误一直到我在这里发布的日志。可惜我没有仔细阅读自己的日志。

相关内容

  • 没有找到相关文章

最新更新