GDC

2014-11-02 7 views
4

TL과 DerelictGL3에 연결, DR :GDC

어떻게 GDC와 함께, 그것에 연결에, DerelictGL3 등의 소스를 가지고에서받을 수 있나요?

자세한 불만 :

난 다음 명령을 사용하여이 프로그램을 빌드하기 위해 노력하고있어 (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(); 
} 

D.로 작성된 작은 프로그램이 있습니다. (리눅스에 있습니다.)

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 가, 영업 이익은 그들이 동적 연결을 시도 되었기 때문에 그들이 아니라 .A 형태보다 .so는 형태로 자신의 라이브러리를 필요로 발견 발견했다. 나는 그것을 조사 중이다.

퍼즐의 또 다른 조각 : 나는 오히려 버려진에 연결하는 데 문제가보다 지금

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

내 GDC 호출의 관련 부분을 변경 한 , 나는 문제에 연결을 가진 것으로 나타 _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/빈 아닌 다른 (즉 잘못된 이름이라면 용서), 때 것을 믿습니다/usr/bin에 -L 경로를 겹쳐 씁니다. (lib 디렉토리를 두었던 곳이기 때문에) 문제가 있습니다. 그 중 하나, 또는 나는 처음에 D를 잘못 설치했다. 그러나 두 경우 모두 위에서 언급 한 예제에서 실제로 libDerelictGL3.a를 찾고 있습니다! =)

+0

분명히하기 위해 "소스를 잊어 버리고 apt-get를 사용하십시오"라는 형식의 대답도 환영합니다. 그 길도별로 행운이 없었어요. – kd8azz

+0

-lphobos2 또는 -lgphobos2 또는 그와 유사한 것을 추가하여 어떤 일이 일어나는지보십시오. –

+0

의견을 보내 주셔서 감사합니다. @ AdamD.Ruppe; 고맙게도 나는 어리석은 실수를 발견했다. – kd8azz

답변

1

편집 : gdc를 사용하여 Derelict를 빌드하기 위해 실제 행을 생략했다고 가정합니다.

dub --compiler=gdc 

각 패키지의 소스 디렉토리에서이를 실행하고 lib /의 내용을/usr/bin에 복사했습니다.


알아 냈습니다. 철저한 포스트 모르 던을위한 시간 "다음 사람을위한".

나는 얼마 전에이 프로젝트를 시작했는데, 나는 llvm 기반의 D 컴파일러 인 ldc를 사용하기 시작했다는 것을 잊었다. 어떤 이유로, 필자는/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 

이 유머러스하게 충분한, GDC 실수 대 LDC는 모든 방법을 내가 여기에 게시 로그로 만든 : 다음 사람을 위해, 여기 내 스크립트로 결국거야. 너무 나 자신의 로그를 자세히 읽지는 않았다.