2016-10-09 4 views
0

私はOpenGLといくつかの他のネイティブライブラリ(Derelictライブラリを使用して)とのインタフェースを持つDでアプリケーションを書いています。しかし、このエラーはまったく関連していないようです。私は「ダブビルド」を行うたびリンカエラー:未定義の `内部 'への参照

コンパイルは成功しますが、ldは、このメッセージで失敗します。

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.

EDITリンクします:x86_64版のためにコンパイルするときにこのエラーが発生するだけに。 x86は問題なく動作します。

SyncLockは、私が「同期」のブロックに使用する空のクラス(もしわからない
private SyncLock lock = new SyncLock(); 

:私は2つのファイル(両方が同じである)の2つのラインにそれを追跡してきた

+0

'extern(C)void internal()'または宣言されているが定義されていないような関数や変数があります。その 'mango_engine.graphics'モジュールは、あなたのコードですか、ライブラリですか? –

+0

@ AdamD.Ruppe私はプロジェクト全体で1つのextern文しか持っていませんが、実装はあります。それはまた、 "内部"の近くのどこにでも指定されていません – jython234

答えて

0

これは正しい方法です)。何らかの理由で、コンストラクタに初期化を移すと、エラーは発生しません。

+2

クラスメンバの初期化はコンストラクタとはまったく異なります。クラスメンバは静的に初期化されます。つまり、 'new SyncLoc()'はコンパイル時に実行され、データ内の単一のオブジェクトへのポインタは、クラス初期化子の一部となります。つまり、クラスのすべてのインスタンスは、SyncLockの静的インスタンスを共有します。コンストラクタは、各インスタンスを分離する必要がある場合(ほとんどの場合、常に必要なもの)、それを行う方法です。なぜ私はそこに '内部 'シンボルがあるのか​​理解できませんが、' private Object x = new Object(); 'は、とにかく初心者の間違いです。 –

+0

そして、プログラムを適切な並行した方法で書くのであれば、通常はロックを使わずに何でもできます。ロックのないプログラミングは、ロックが高価な回避策であるため、回避する可能性が最も高い方法のために行く方法です。 – Bauss

関連する問題