2013-07-14 14 views
6

最近、私は美しい言語Dを学びました。これはとてもプラスチックであり、安定した高速プログラムを書くのに役立ちます。しかし、それは普及していません... Dに書かれたコードはほとんどなく、CやC++にも多くのコードが書かれています。したがって、著者がAndrei Alexanderscuの本を読むと、DライブラリをC++コードにリンクすることについての表面的な質問がありましたが、私は自分自身でそれを学び、DでAutomataInterfaceを実装するCompleteAutomataクラスのインスタンスを返す定義済み関数DライブラリをC++コードにリンクする

#ifndef AUTOMATAINTERFACE_H 
#define AUTOMATAINTERFACE_H 

class AutomataInterface { 
public: 
    virtual ~AutomataInterface() {} 

    virtual void next() = 0; 

    virtual void save() = 0; 
    virtual void restore() = 0; 
    virtual void zerofile() = 0; 

    virtual void invert(unsigned long x, unsigned long y) = 0; 

    virtual int state(unsigned long x, unsigned long y) const = 0; 

    virtual unsigned long x() const = 0; 
    virtual unsigned long y() const = 0; 
}; 

AutomataInterface *createAutomata(unsigned long x, unsigned long y); 

#endif // AUTOMATAINTERFACE_H 

関連するDコード:C++コードにコードの後

import agregator; // this is my own lib 

extern(C++) { 
    interface AutomataInterface { 
     void next(); 

     void save(); 
     void restore(); 
     void zerofile(); 

     void invert(size_t x, size_t y); 

     int state(size_t x, size_t y) const; 

     size_t x() const; 
     size_t y() const; 
    } 

    AutomataInterface createAutomata(ulong x, ulong y) { 
     return new CompleteAutomata(x, y); 
    } 
} 

export class CompleteAutomata : AutomataInterface { 
    // instance variables... 
    this(size_t x, size_t y) { /* ... */ } 

    extern(C++) { 
     override void next() { 
      // ... 
     } 

     // others overridden interface methods... 
    } 
} 

が書かれていた、私は以下のフラグで、二つの異なるコンパイラ(dmdgdc)によってDライブラリのコンパイルしました:

dmd -release -O -lib -odlib -ofliblife.h *.d 

または

gdc -frelease -O2 -Wall -c *.d 
ar cq lib/liblife.a *.o 

私はリンクをしようと、ライブラリディレクトリ( -Lオプション)へのパスを追加し、直接( -lオプション)のlibを追加してQtのプロジェクトに受信LIBSの各。どちらの場合もエラーが出ます。第 dmd場合

Iが別のエラーの「不定_d_newclass `を参照」とカップル有する:

g++ -Wl,-O1 -Wl,-z,relro -o automata main.o mainwindow.o renderarea.o button.o playbutton.o moc_mainwindow.o moc_renderarea.o moc_button.o moc_playbutton.o -L/home/newmen/projects/d/life/lib -llife -lQtGui -lQtCore -lpthread 
/home/newmen/projects/d/life/lib/liblife.a(complete_automata_1fe_5b0.o): In function `createAutomata(unsigned int, unsigned int)': 
complete_automata.d:(.text._Z14createAutomatajj+0x27): undefined reference to `_d_newclass' 
/home/newmen/projects/d/life/lib/liblife.a(complete_automata_1ff_675.o):(.data+0x0): undefined reference to `_D14TypeInfo_Class6__vtblZ' 
/home/newmen/projects/d/life/lib/liblife.a(complete_automata_1ff_675.o):(.data+0x50): undefined reference to `_D6Object7__ClassZ' 
/home/newmen/projects/d/life/lib/liblife.a(complete_automata_1ff_675.o):(.data+0xd0): undefined reference to `_D14TypeInfo_Class6__vtblZ' 
/home/newmen/projects/d/life/lib/liblife.a(complete_automata_1ff_675.o):(.data+0x120): undefined reference to `_D6Object7__ClassZ' 
/home/newmen/projects/d/life/lib/liblife.a(complete_automata_1ff_675.o):(.rodata+0x68): undefined reference to `_D6object6Object8toStringMFZAya' 
/home/newmen/projects/d/life/lib/liblife.a(complete_automata_1ff_675.o):(.rodata+0x70): undefined reference to `_D6object6Object6toHashMFNbNeZm' 
/home/newmen/projects/d/life/lib/liblife.a(complete_automata_1ff_675.o):(.rodata+0x78): undefined reference to `_D6object6Object5opCmpMFC6ObjectZi' 
/home/newmen/projects/d/life/lib/liblife.a(complete_automata_1ff_675.o):(.rodata+0x80): undefined reference to `_D6object6Object8opEqualsMFC6ObjectZb' 
/home/newmen/projects/d/life/lib/liblife.a(complete_automata_1ff_675.o):(.rodata+0xf8): undefined reference to `_D6object6Object8toStringMFZAya' 
/home/newmen/projects/d/life/lib/liblife.a(complete_automata_1ff_675.o):(.rodata+0x100): undefined reference to `_D6object6Object6toHashMFNbNeZm' 
/home/newmen/projects/d/life/lib/liblife.a(complete_automata_1ff_675.o):(.rodata+0x108): undefined reference to `_D6object6Object5opCmpMFC6ObjectZi' 
/home/newmen/projects/d/life/lib/liblife.a(complete_automata_1ff_675.o):(.rodata+0x110): undefined reference to `_D6object6Object8opEqualsMFC6ObjectZb' 
/home/newmen/projects/d/life/lib/liblife.a(complete_automata_1ff_675.o): In function `_D17complete_automata16CompleteAutomata6__ctorMFmmZC17complete_automata16CompleteAutomata': 
complete_automata.d:(.text._D17complete_automata16CompleteAutomata6__ctorMFmmZC17complete_automata16CompleteAutomata+0x1f): undefined reference to `_d_newclass' 
complete_automata.d:(.text._D17complete_automata16CompleteAutomata6__ctorMFmmZC17complete_automata16CompleteAutomata+0x46): undefined reference to `_d_newclass' 
/home/newmen/projects/d/life/lib/liblife.a(complete_automata_1ff_675.o): In function `CompleteAutomata::next()': 
complete_automata.d:(.text._ZN16CompleteAutomata4nextEv+0x2f): undefined reference to `_d_newclass' 
/home/newmen/projects/d/life/lib/liblife.a(complete_automata_1ff_675.o): In function `CompleteAutomata::save()': 
complete_automata.d:(.text._ZN16CompleteAutomata4saveEv+0x25): undefined reference to `_adDupT' 
/home/newmen/projects/d/life/lib/liblife.a(complete_automata_1ff_675.o): In function `CompleteAutomata::restore()': 
complete_automata.d:(.text._ZN16CompleteAutomata7restoreEv+0x33): undefined reference to `_d_newclass' 
/home/newmen/projects/d/life/lib/liblife.a(complete_automata_1ff_675.o): In function `CompleteAutomata::zerofile()': 
complete_automata.d:(.text._ZN16CompleteAutomata8zerofileEv+0x2f): undefined reference to `_d_newclass' 
/home/newmen/projects/d/life/lib/liblife.a(object_201_8b7.o): In function `no symbol': 
/usr/include/dmd/druntime/import/object.di:(.text+0x6): undefined reference to `_Dmodule_ref' 
/home/newmen/projects/d/life/lib/liblife.a(object_201_8b7.o):(.data._D12TypeInfo_Axi6__initZ+0x0): undefined reference to `_D14TypeInfo_Array6__vtblZ' 
/home/newmen/projects/d/life/lib/liblife.a(object_201_8b7.o): In function `_D46/usr/include/dmd/druntime/import/object.di.5137__arrayZ': 
/usr/include/dmd/druntime/import/object.di:(.text._D46/usr/include/dmd/druntime/import/object.di.5137__arrayZ+0x16): undefined reference to `_d_array_bounds' 
/home/newmen/projects/d/life/lib/liblife.a(object_201_8b7.o): In function `_D46/usr/include/dmd/druntime/import/object.di.5138__assertFiZv': 
/usr/include/dmd/druntime/import/object.di:(.text._D46/usr/include/dmd/druntime/import/object.di.5138__assertFiZv+0x16): undefined reference to `_d_assertm' 
/home/newmen/projects/d/life/lib/liblife.a(object_201_8b7.o): In function `_D46/usr/include/dmd/druntime/import/object.di.51315__unittest_failFiZv': 
/usr/include/dmd/druntime/import/object.di:(.text._D46/usr/include/dmd/druntime/import/object.di.51315__unittest_failFiZv+0x16): undefined reference to `_d_unittestm' 
/home/newmen/projects/d/life/lib/liblife.a(object_203_875.o): In function `no symbol': 
/usr/include/dmd/druntime/import/object.di:(.text+0x6): undefined reference to `_Dmodule_ref' 
/home/newmen/projects/d/life/lib/liblife.a(object_203_875.o):(.data._D11TypeInfo_xi6__initZ+0x0): undefined reference to `_D14TypeInfo_Const6__vtblZ' 
/home/newmen/projects/d/life/lib/liblife.a(object_203_875.o):(.data._D11TypeInfo_xi6__initZ+0x10): undefined reference to `_D10TypeInfo_i6__initZ' 
/home/newmen/projects/d/life/lib/liblife.a(object_203_875.o): In function `_D46/usr/include/dmd/druntime/import/object.di.5157__arrayZ': 
/usr/include/dmd/druntime/import/object.di:(.text._D46/usr/include/dmd/druntime/import/object.di.5157__arrayZ+0x16): undefined reference to `_d_array_bounds' 
/home/newmen/projects/d/life/lib/liblife.a(object_203_875.o): In function `_D46/usr/include/dmd/druntime/import/object.di.5158__assertFiZv': 
/usr/include/dmd/druntime/import/object.di:(.text._D46/usr/include/dmd/druntime/import/object.di.5158__assertFiZv+0x16): undefined reference to `_d_assertm' 
/home/newmen/projects/d/life/lib/liblife.a(object_203_875.o): In function `_D46/usr/include/dmd/druntime/import/object.di.51515__unittest_failFiZv': 
/usr/include/dmd/druntime/import/object.di:(.text._D46/usr/include/dmd/druntime/import/object.di.51515__unittest_failFiZv+0x16): undefined reference to `_d_unittestm' 
/home/newmen/projects/d/life/lib/liblife.a(agregator.o): In function `no symbol': 
agregator.d:(.text+0x6): undefined reference to `_Dmodule_ref' 
/home/newmen/projects/d/life/lib/liblife.a(agregator.o):(.data+0x10): undefined reference to `_D3std6random12__ModuleInfoZ' 
/home/newmen/projects/d/life/lib/liblife.a(agregator.o):(.rodata+0x20): undefined reference to `_D14TypeInfo_Class6__vtblZ' 
/home/newmen/projects/d/life/lib/liblife.a(agregator.o): In function `_D9agregator7__arrayZ': 
agregator.d:(.text._D9agregator7__arrayZ+0x16): undefined reference to `_d_array_bounds' 
/home/newmen/projects/d/life/lib/liblife.a(agregator.o): In function `_D9agregator8__assertFiZv': 
agregator.d:(.text._D9agregator8__assertFiZv+0x16): undefined reference to `_d_assertm' 
/home/newmen/projects/d/life/lib/liblife.a(agregator.o): In function `_D9agregator15__unittest_failFiZv': 
agregator.d:(.text._D9agregator15__unittest_failFiZv+0x16): undefined reference to `_d_unittestm' 
/home/newmen/projects/d/life/lib/liblife.a(agregator_2_5fd.o):(.data+0x0): undefined reference to `_D14TypeInfo_Class6__vtblZ' 
/home/newmen/projects/d/life/lib/liblife.a(agregator_2_5fd.o):(.data+0x50): undefined reference to `_D6Object7__ClassZ' 
/home/newmen/projects/d/life/lib/liblife.a(agregator_2_5fd.o):(.rodata+0x48): undefined reference to `_D6object6Object8toStringMFZAya' 
... 

第2のケースで(gdcを使用して)I『は、複数の定義』に関するメッセージを受信する。

そうする試みの2日後
g++ -Wl,-O1 -Wl,-z,relro -o cellular_life main.o mainwindow.o renderarea.o button.o playbutton.o moc_mainwindow.o moc_renderarea.o moc_button.o moc_playbutton.o -L/home/newmen/projects/d/life/lib -llife -lQtGui -lQtCore -lpthread 
/home/newmen/projects/d/life/lib/liblife.a(complete_automata.o): In function `_D17complete_automata16CompleteAutomata7restoreMRZv14SliceAgregator9initValueMxFmmZi': 
complete_automata.d:(.text+0x0): multiple definition of `_D17complete_automata16CompleteAutomata7restoreMRZv14SliceAgregator9initValueMxFmmZi' 
/home/newmen/projects/d/life/lib/liblife.a(complete_automata_1ff_675.o):complete_automata.d:(.text._D17complete_automata16CompleteAutomata7restoreMRZv14SliceAgregator9initValueMxFmmZi+0x0): first defined here 
/home/newmen/projects/d/life/lib/liblife.a(complete_automata.o): In function `CompleteAutomata::invert(unsigned long long, unsigned long long)': 
complete_automata.d:(.text+0x40): multiple definition of `CompleteAutomata::invert(unsigned long long, unsigned long long)' 
/home/newmen/projects/d/life/lib/liblife.a(complete_automata_1ff_675.o):complete_automata.d:(.text._ZN16CompleteAutomata6invertEyy+0x0): first defined here 
/home/newmen/projects/d/life/lib/liblife.a(complete_automata.o): In function `CompleteAutomata::state(unsigned long long, unsigned long long) const': 
complete_automata.d:(.text+0x60): multiple definition of `CompleteAutomata::state(unsigned long long, unsigned long long) const' 
/home/newmen/projects/d/life/lib/liblife.a(complete_automata_1ff_675.o):complete_automata.d:(.text._ZNK16CompleteAutomata5stateEyy+0x0): first defined here 
/home/newmen/projects/d/life/lib/liblife.a(complete_automata.o): In function `CompleteAutomata::x() const': 
complete_automata.d:(.text+0x80): multiple definition of `CompleteAutomata::x() const' 
/home/newmen/projects/d/life/lib/liblife.a(complete_automata_1ff_675.o):complete_automata.d:(.text._ZNK16CompleteAutomata1xEv+0x0): first defined here 
/home/newmen/projects/d/life/lib/liblife.a(complete_automata.o): In function `CompleteAutomata::y() const': 
complete_automata.d:(.text+0xa0): multiple definition of `CompleteAutomata::y() const' 
/home/newmen/projects/d/life/lib/liblife.a(complete_automata_1ff_675.o):complete_automata.d:(.text._ZNK16CompleteAutomata1yEv+0x0): first defined here 
/home/newmen/projects/d/life/lib/liblife.a(complete_automata.o): In function `CompleteAutomata::next()': 
complete_automata.d:(.text+0x140): multiple definition of `CompleteAutomata::next()' 
/home/newmen/projects/d/life/lib/liblife.a(complete_automata_1ff_675.o):complete_automata.d:(.text._ZN16CompleteAutomata4nextEv+0x0): first defined here 
/home/newmen/projects/d/life/lib/liblife.a(complete_automata.o):(.tbss+0x10): multiple definition of `_D17complete_automata16CompleteAutomata4nextMRZv7changerC7changer7Changer' 
/home/newmen/projects/d/life/lib/liblife.a(complete_automata_1ff_675.o):(.tbss+0x0): first defined here 
/home/newmen/projects/d/life/lib/liblife.a(complete_automata.o): In function `CompleteAutomata::restore()': 
complete_automata.d:(.text+0x1b0): multiple definition of `CompleteAutomata::restore()' 
/home/newmen/projects/d/life/lib/liblife.a(complete_automata_1ff_675.o):complete_automata.d:(.text._ZN16CompleteAutomata7restoreEv+0x0): first defined here 
/home/newmen/projects/d/life/lib/liblife.a(complete_automata.o):(.tbss+0x8): multiple definition of `_D17complete_automata16CompleteAutomata7restoreMRZv9agregatorC9agregator9Agregator' 
/home/newmen/projects/d/life/lib/liblife.a(complete_automata_1ff_675.o):(.tbss+0x8): first defined here 
/home/newmen/projects/d/life/lib/liblife.a(complete_automata.o):(.data+0x180): multiple definition of `_D_ZN16CompleteAutomata7restoreEv14SliceAgregator7__ClassZ' 
/home/newmen/projects/d/life/lib/liblife.a(complete_automata_1ff_675.o):(.data+0x0): first defined here 
/home/newmen/projects/d/life/lib/liblife.a(complete_automata.o): In function `CompleteAutomata::zerofile()': 
complete_automata.d:(.text+0x220): multiple definition of `CompleteAutomata::zerofile()' 
/home/newmen/projects/d/life/lib/liblife.a(complete_automata_1ff_675.o):complete_automata.d:(.text._ZN16CompleteAutomata8zerofileEv+0x0): first defined here 
/home/newmen/projects/d/life/lib/liblife.a(complete_automata.o):(.tbss+0x0): multiple definition of `_D17complete_automata16CompleteAutomata8zerofileMRZv9agregatorC9agregator9Agregator' 
/home/newmen/projects/d/life/lib/liblife.a(complete_automata_1ff_675.o):(.tbss+0x10): first defined here 
/home/newmen/projects/d/life/lib/liblife.a(complete_automata.o): In function `CompleteAutomata::save()': 
complete_automata.d:(.text+0x290): multiple definition of `CompleteAutomata::save()' 
/home/newmen/projects/d/life/lib/liblife.a(complete_automata_1ff_675.o):complete_automata.d:(.text._ZN16CompleteAutomata4saveEv+0x0): first defined here 
/home/newmen/projects/d/life/lib/liblife.a(complete_automata.o):(.data+0x80): multiple definition of `_D17complete_automata16CompleteAutomata7__ClassZ' 
/home/newmen/projects/d/life/lib/liblife.a(complete_automata_1ff_675.o):(.data+0xd0): first defined here 
/home/newmen/projects/d/life/lib/liblife.a(complete_automata.o): In function `_D17complete_automata16CompleteAutomata6__ctorMFmmZC17complete_automata16CompleteAutomata': 
complete_automata.d:(.text+0x9b0): multiple definition of `_D17complete_automata16CompleteAutomata6__ctorMFmmZC17complete_automata16CompleteAutomata' 
/home/newmen/projects/d/life/lib/liblife.a(complete_automata_1ff_675.o):complete_automata.d:(.text._D17complete_automata16CompleteAutomata6__ctorMFmmZC17complete_automata16CompleteAutomata+0x0): first defined here 
/home/newmen/projects/d/life/lib/liblife.a(complete_automata.o):(.rodata+0x420): multiple definition of `_D17complete_automata16CompleteAutomata6__vtblZ' 
/home/newmen/projects/d/life/lib/liblife.a(complete_automata_1ff_675.o):(.rodata+0xf0): first defined here 
/usr/bin/ld: Warning: size of symbol `_D17complete_automata16CompleteAutomata6__vtblZ' changed from 104 in /home/newmen/projects/d/life/lib/liblife.a(complete_automata_1ff_675.o) to 112 in /home/newmen/projects/d/life/lib/liblife.a(complete_automata.o) 
/home/newmen/projects/d/life/lib/liblife.a(complete_automata.o):(.rodata+0x4a0): multiple definition of `_D17complete_automata16CompleteAutomata6__initZ' 
/home/newmen/projects/d/life/lib/liblife.a(complete_automata_1ff_675.o):(.rodata+0x90): first defined here 
/home/newmen/projects/d/life/lib/liblife.a(complete_automata.o):(.rodata+0x4e0): multiple definition of `_D_ZN16CompleteAutomata7restoreEv14SliceAgregator6__vtblZ' 
/home/newmen/projects/d/life/lib/liblife.a(complete_automata_1ff_675.o):(.rodata+0x60): first defined here 
/usr/bin/ld: Warning: size of symbol `_D_ZN16CompleteAutomata7restoreEv14SliceAgregator6__vtblZ' changed from 48 in /home/newmen/projects/d/life/lib/liblife.a(complete_automata_1ff_675.o) to 56 in /home/newmen/projects/d/life/lib/liblife.a(complete_automata.o) 
/home/newmen/projects/d/life/lib/liblife.a(complete_automata.o):(.rodata+0x520): multiple definition of `_D_ZN16CompleteAutomata7restoreEv14SliceAgregator6__initZ' 
/home/newmen/projects/d/life/lib/liblife.a(complete_automata_1ff_675.o):(.rodata+0x0): first defined here 
/home/newmen/projects/d/life/lib/liblife.a(agregator.o): In function `_D3std7complex14__T7ComplexTeZ7Complex8toStringMxFMDFAxaZvAyaZAya12__lambda1223MFNbNfAxaZv': 
agregator.d:(.text+0xaf): undefined reference to `_D11TypeInfo_Aa6__initZ' 
agregator.d:(.text+0xb7): undefined reference to `_d_arrayappendT' 
/home/newmen/projects/d/life/lib/liblife.a(agregator.o): In function `_D3std4conv16__T6toImplTiTxkZ6toImplFNaNfxkZi15__dgliteral1389MFNaNfZC6object9Throwable': 
agregator.d:(.text+0xc5): undefined reference to `_D3std4conv21ConvOverflowException7__ClassZ' 
agregator.d:(.text+0xca): undefined reference to `_d_newclass' 
agregator.d:(.text+0xed): undefined reference to `_D3std4conv21ConvOverflowException6__ctorMFAyaAyamZC3std4conv21ConvOverflowException' 
/home/newmen/projects/d/life/lib/liblife.a(agregator.o): In function `_D3std6format17__T9getNthIntTxeZ9getNthIntFNaNfkxeZi.part.6': 
agregator.d:(.text+0x105): undefined reference to `_D3std6format15FormatException7__ClassZ' 
agregator.d:(.text+0x10a): undefined reference to `_d_newclass' 
... 

...

最近Phobos(D標準ライブラリ)をリンクプロセスに追加しようとしました。 dmd -lphobos2フラグとgdc -lgphobos2フラグに対応します。しかしdmdリンカ出力使用している場合、それは...

私を助けていない:

g++ -Wl,-O1 -Wl,-z,relro -o cellular_life main.o mainwindow.o renderarea.o button.o playbutton.o moc_mainwindow.o moc_renderarea.o moc_button.o moc_playbutton.o -L/home/newmen/projects/d/life/lib -llife -lQtGui -lQtCore -lpthread -lphobos2 
/usr/lib/gcc/x86_64-redhat-linux/4.7.2/../../../../lib64/libphobos2.so: undefined reference to `[email protected]_GNUTLS_3' 
/usr/lib/gcc/x86_64-redhat-linux/4.7.2/../../../../lib64/libphobos2.so: undefined reference to `[email protected]_GNUTLS_3' 
/usr/lib/gcc/x86_64-redhat-linux/4.7.2/../../../../lib64/libphobos2.so: undefined reference to `[email protected]_GNUTLS_3' 
/usr/lib/gcc/x86_64-redhat-linux/4.7.2/../../../../lib64/libphobos2.so: undefined reference to `[email protected]_GNUTLS_3' 
/usr/lib/gcc/x86_64-redhat-linux/4.7.2/../../../../lib64/libphobos2.so: undefined reference to `[email protected]_GNUTLS_3' 
/usr/lib/gcc/x86_64-redhat-linux/4.7.2/../../../../lib64/libphobos2.so: undefined reference to `[email protected]_GNUTLS_3' 
/usr/lib/gcc/x86_64-redhat-linux/4.7.2/../../../../lib64/libphobos2.so: undefined reference to `[email protected]_GNUTLS_3' 
/usr/lib/gcc/x86_64-redhat-linux/4.7.2/../../../../lib64/libphobos2.so: undefined reference to `_Dmain' 
/usr/lib/gcc/x86_64-redhat-linux/4.7.2/../../../../lib64/libphobos2.so: undefined reference to `[email protected]_GNUTLS_3' 
/usr/lib/gcc/x86_64-redhat-linux/4.7.2/../../../../lib64/libphobos2.so: undefined reference to `[email protected]_GNUTLS_3' 
/usr/lib/gcc/x86_64-redhat-linux/4.7.2/../../../../lib64/libphobos2.so: undefined reference to `[email protected]_GNUTLS_3' 
/usr/lib/gcc/x86_64-redhat-linux/4.7.2/../../../../lib64/libphobos2.so: undefined reference to `[email protected]_GNUTLS_3' 
collect2: error: ld returned 1 exit status 
make: *** [cellular_life] Error 1 

を、私はlibcurlを-GNUTLSの代替を試してみました:ln -s /usr/lib64/libcurl.so.4 /usr/lib64/libcurl-gnutls.so.4。 libcurl-gnutlsに関するメッセージは表示されずにリンクされた結果です。

gdcリンカの出力を使用する場合は、再び「に複数の定義」について話:

/home/newmen/gcc/bin/g++ -Wl,-O1 -Wl,-z,relro -o cellular_life main.o mainwindow.o renderarea.o button.o playbutton.o moc_mainwindow.o moc_renderarea.o moc_button.o moc_playbutton.o -L/home/newmen/gcc/lib64 -L/home/newmen/projects/d/life/lib -llife -lQtGui -lQtCore -lpthread -lgphobos2 
/home/newmen/projects/d/life/lib/liblife.a(complete_automata.o): In function `_D17complete_automata16CompleteAutomata7restoreMRZv14SliceAgregator9initValueMxFmmZi': 
complete_automata.d:(.text+0x0): multiple definition of `_D17complete_automata16CompleteAutomata7restoreMRZv14SliceAgregator9initValueMxFmmZi' 
/home/newmen/projects/d/life/lib/liblife.a(complete_automata_1e3_675.o):complete_automata.d:(.text._D17complete_automata16CompleteAutomata7restoreMRZv14SliceAgregator9initValueMxFmmZi+0x0): first defined here 
/home/newmen/projects/d/life/lib/liblife.a(complete_automata.o): In function `CompleteAutomata::invert(unsigned long long, unsigned long long)': 
complete_automata.d:(.text+0x40): multiple definition of `CompleteAutomata::invert(unsigned long long, unsigned long long)' 
/home/newmen/projects/d/life/lib/liblife.a(complete_automata_1e3_675.o):complete_automata.d:(.text._ZN16CompleteAutomata6invertEyy+0x0): first defined here 
... 
/home/newmen/gcc/lib64/libgphobos2.a(dmain2.o): In function `main': 
/home/newmen/projects/distrib/gcc-4.8.1/x86_64-unknown-linux-gnu/libphobos/libdruntime/../../.././libphobos/libdruntime/rt/dmain2.d:394: multiple definition of `main' 
main.o:/home/newmen/projects/d/life/qt_viewer/main.cpp:5: first defined here 
/usr/bin/ld: /home/newmen/gcc/lib64/libgphobos2.a(time.o): undefined reference to symbol '[email protected]@GLIBC_2.2.5' 
/usr/bin/ld: note: '[email protected]@GLIBC_2.2.5' is defined in DSO /lib64/librt.so.1 so try adding it to the linker command line 
/lib64/librt.so.1: could not read symbols: Invalid operation 
collect2: error: ld returned 1 exit status 
make: *** [cellular_life] Error 1 

を最後にlibrt.so.1についてのメッセージを。私は/ usr/lib64を調べ、そこにライブラリファイルを見ました。

親愛なる魔法使い、DライブラリをC++コードに接続する方法を教えてください。

答えて

9

Dコンパイラは、リンクをやらせるために、一般的に簡単です:あなたは以前と同様に

g++ -c yourfile.cpp 
dmd yourfile.o d_file.d 

あなたは同じ、同様にそれにカールを追加する必要があります。(あなたがGDCを使用している場合は、同じように動作するはずですかgdmd)DMDを通じてリンカ引数を渡すには、(それができるだけであまりにもDで)(メイン置くことが一般的に簡単です-Larg

dmd yourfile.o d_file.d -L-lstdc++ -L-lcurl -L-lQtGui # and so on 

を渡しますC++で定義された関数にもすぐに呼び出すことができます。そうしないと、おそらくDランタイムをC++から使用する前に初期化する必要があるからです。

しかし、あなたが始めたプロセスを終了するには...まず、あなたのliblife.aに同じファイルが2回追加されているようです。そのファイルを削除して再作成するか、そのステップをスキップして.oファイルを最初に.aファイルに入れないで直接リンカに渡してみます。それは物事を少し簡素化します。

私の他の質問は、なぜDメインを引き出そうとしているのですか?あなたの.dコードのどこかにmain()がありますか?もしそうなら、それはOKですが、C++コードからそのコードを削除する必要があります。 (おそらくcppmainにその名前を変更し、メインDからそれを呼び出す:

Dコード:

extern(C++) int cppmain(int argc, char** argv); 

int main() { 
     import core.runtime; 
     return cppmain(Runtime.cArgs.argc, Runtime.cArgs.argv); 
} 

をそして、それはあなたのC++メインに転送されます、あなたがDのメインを削除したい場合は(それがあると仮定。そこに、私は知っていると私は)そのリンカエラーが発生する可能性があり、他に何を考えるしようとするでしょうではない、C++でのTOU使用Dコードの前に、あなたがそうD.を初期化したいと思う場合:

Dコード:

extern(C++) void initD() { 
     import core.runtime; 
     Runtime.initialize(); 
} 

C++コード:

extern "C++" void initD(); 
int main() { 
     initD(); 
     // the rest of your stuff 
} 

これをしないと、D関数を呼び出すとsegfaultが発生する可能性があります。

しかし、要約すると、重複した.oファイルがアーカイブに追加され、メインがDとC++の両方で定義されていることは間違いありません。アーカイブ内の重複を削除し、重複した本管の1つを削除してください。

+0

あなたの答えを見る前に、私はリンカーとして 'dmd'を使う必要があることを知りました。私は主な機能は、C + +コードで説明したときにコードをリンクしようとしました。そのような場合、私はバイナリを手に入れ、起動時にsegfaultを取得します。これは警告します。 あなたの記事を読んだ後、私はあなたが書いたように、Dコードでmain関数を作成し、cppmain関数から呼び出しようとしました。このような場合、リンクした後、セグメンテーションを開始するときもバイナリを取得しますが、今回のバックトレースははるかに多く、Dクラスのメソッドへの参照時にエラーが発生したことを示します。CompleteAutomata –

+0

C++からDに来るときの一般的な間違いの1つは、Dクラスは常にヒープ割り当てが必要なため、CompleteAutomata a =新しいCompleteAtomata();だけでなく、CompleteAutomata a;を実行していることを確認してください。その理由は、Dのクラスは常に参照によって行われます(DのMyClass aはC++のMyClass * aとほとんど同じです)。したがって、newで初期化しないと、参照はnullになり、使用時にはsegfaultになります。 –

+0

別の注記では、DクラスはDからnew'dする必要があり、C++クラスはC++で構築する必要があります。これを回避する方法がありますが、言語は互いにどのようにコンストラクタを呼び出すか分からないため、オブジェクトを初期化するために手動で行う必要があります。しかし、それを母国語で新しくする方がはるかに簡単です。 –