2016-10-09 3 views
0

OpenGL과 몇 가지 다른 기본 라이브러리 (Derelict 라이브러리 사용)와의 인터페이스 인 D에서 응용 프로그램을 작성하고 있습니다. 그러나이 오류는 전혀 관련이없는 것처럼 보입니다. 나는 "더빙 빌드를"할 때마다링커 오류 : 'internal'에 대한 정의되지 않은 참조

컴파일은 성공하지만 신분증이 메시지와 함께 실패합니다

Linking... 
../git/mango-engine/bin/libmango-engine.a(gl_model_503_284.o):(.data._D12mango_engine8graphics6opengl8gl_model7GLModel6__initZ+0x10):  undefined reference to `internal' 
../git/mango-engine/bin/libmango-engine.a(shader_51b_52f.o): (.data._D12mango_engine8graphics6shader13ShaderProgram6__initZ+0x18):  undefined reference to `internal' 
collect2: error: ld returned 1 exit status 

나는 이것이 무엇을 의미하는지 아무 생각이 없다, 그리고 그것을 전에 본 적이 없다. 또한, 이상하게도 특정 파일을 가져올 때만이 오류가 발생합니다 : gl_model.d 및 shader.d, 다른 DUB 프로젝트에서. 가져 오지 않으면 링커가 성공합니다.

내가 제공하는 정보가 무엇인지 확실하지 않다, 그래서 전체 소스 코드를 here.

편집기를 링크 단지 것 : x86_64에 대해 컴파일 할 때이 오류가 발생합니다. x86이 정상적으로 작동합니다.

+0

'extern (C) void internal()'또는 선언되지 않았지만 정의되지 않은 것과 같은 함수 또는 변수가있을 수 있습니다. 'mango_engine.graphics' 모듈은 코드입니까, 라이브러리입니까? –

+0

@ AdamD.Ruppe 전체 프로젝트에서 하나의 extern 문만 있고 구현이 있습니다. 그것은 또한 "내부"근처에 이름이 없습니다. – jython234

답변

0
나는 두 파일에 두 줄 (모두 동일)로 아래로 추적 한

:의 SyncLock 내가 있는지 확실하지 않습니다 ("동기화"블록에 사용하는 빈 클래스이다

private SyncLock lock = new SyncLock(); 

이것이 올바른 방법입니다). 어떤 이유로 초기화를 생성자로 옮기면 오류없이 작동합니다.

+2

클래스 멤버의 초기화는 생성자와 완전히 다릅니다 ... 클래스 멤버는 * 정적으로 * 초기화됩니다. 즉,'new SyncLoc()'이 컴파일 타임에 실행되고, 데이터의 단일 객체에 대한 포인터는 클래스 이니셜 라이저의 일부가됩니다 ... 클래스의 모든 인스턴스는 SyncLock의 정적 인스턴스를 공유합니다. 생성자는 각 인스턴스를 분리해야하는 경우 (거의 항상 원하는대로) 수행해야합니다. 나는 아직도 거기에 '내부'기호가있는 이유를 모르지만'private Object x = new Object(); '는 어쨌든 거의 항상 초보자 실수입니다. –

+0

그리고 일반적으로 적절한 동시 방식으로 프로그램을 작성하면 자물쇠를 사용하지 않고 원하는대로 할 수 있습니다. Lock-free 프로그래밍은 갈 길이 멀다. 왜냐하면 자물쇠는 비싸게 해결할 가능성이 높기 때문이다. – Bauss

관련 문제