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/中安装了libDererctGL3.a、libDerliptGLFW3.a和libDererctUtil.a。
更多的想法:,我真的很困惑为什么我需要针对源代码进行编译。这不是C++,也没有头文件。当我放弃-I行时,编译器不知道如何打开gl3模块。它不应该仅仅推断我使用的函数是存在的,如果/当它找不到它时,它就会有链接器错误吗?既然我已经编译了库,并且在搜索路径中,为什么GDC不能计算出其余的呢?
More than:I最近在这种情况下找到了Can't link GLFW3: undefined references,OP发现他们需要以.so形式而不是.a形式的库,因为他们尝试动态链接。我目前正在调查。
这个难题的另一部分:,我已经将我的gdc调用的相关部分更改为
-I/usr/include/d2 \
-L -ldl \
-L/usr/bin \
-lDerelictUtil \
-lDerelictGL3 \
-lDerelictGLFW3现在,我并没有在链接到废弃文件时遇到问题,而是在链接到_d_runtime本身时遇到了问题。
输出数为数百行,类似于以下内容:
/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。但是在这两种情况下,它实际上都是在前面的示例中找到libDerlictGL3.a!=)
发布于 2014-11-04 02:44:02
编辑:我想我忽略了用gdc构建废弃的实际行。
dub --compiler=gdc我在每个废弃包的源目录中执行了这个操作,并复制了lib/ to /usr/bin的内容。
我已经想明白了。是时候做一个彻底的“下一个人”了。
我一段时间前就开始了这个项目,我忘记了我已经开始使用ldc,一个基于llvm的D编译器。出于某种原因,我将/usr/bin/dmd2 2符号链接到本地构建的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有趣的是,最不发达国家对gdc的错误,一直到我在这里张贴的日志。可惜我没有仔细阅读自己的日志。
https://stackoverflow.com/questions/26704385
复制相似问题