2013-07-14 10 views
6

Recentemente ho imparato il bellissimo linguaggio D, che è molto più plastico e ti aiuta a scrivere programmi veloci stabili. Ma non è popolare ... perché pochi codici scritti su D e molto altro su C e C++. Quindi, dopo aver letto il libro di Andrei Alexanderscu in cui l'autore ha descritto superficialmente una domanda sul collegamento della libreria D al codice C++, ho provato a impararlo da solo e ho scritto del codice su D, dove funzione definita che restituisce un'istanza della classe CompleteAutomata che implementa anche AutomataInterface in codice C++:Collegamento della libreria D al codice 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 

codice D Rilevante:

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... 
    } 
} 

dopo il codice aveva scritto, ho la compilazione della libreria D da due compilatori diversi (dmd e gdc), con i seguenti bandiere:

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

o

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

Quando cercando collegamento ciascuna delle librerie Qt ricevuti a progetto con l'aggiunta di percorso a dir libreria (-L opzione) e l'aggiunta di un lib direttamente (-l opzione). Ho avuto errori in entrambi i casi.

In primo dmd caso ho "undefined reference to` _d_newclass'" e un paio di altri errori:

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' 
... 

Nel secondo caso (quando si utilizza gdc) Mi riceve un messaggio di "definizione multiplo del":

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' 
... 

Dopo due giorni di tentativi per farlo ...

Recentemente ho provato ad aggiungere Phobos (libreria standard D) al processo di collegamento. Per la bandiera dmd -lphobos2 e per la bandiera gdc -lgphobos2 corrispondono. Ma non mi aiuta ...

Quando si utilizza dmd uscita del linker:

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 

e ho provare sostituto di libcurl-gnutls: ln -s /usr/lib64/libcurl.so.4 /usr/lib64/libcurl-gnutls.so.4. Quindi il risultato di collegare lo stesso, ma senza messaggio su libcurl-gnutls.

Quando si utilizza gdc uscita del linker di nuovo parlare di "definizione multipla a":

/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 

con messaggio sulla librt.so.1 alla fine. Controllo/usr/lib64 e ho visto lì il file della libreria.

Cara magia, per favore dimmi come collegare la libreria D al codice C++.

risposta

9

è generalmente più facile lasciare che il compilatore D fare il collegamento:

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

Potrebbe essere necessario aggiungere curl per esso pure, proprio come avete fatto prima.Per passare un argomento linker attraverso DMD (o gdmd se si sta utilizzando GDC, dovrebbe lavorare allo stesso modo), passare -Larg

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

E 'generalmente più facile da mettere main() in D troppo (si può solo richiama immediatamente anche una funzione definita in C++) perché altrimenti probabilmente dovrai inizializzare il runtime D prima di usarlo dal C++.

Ma per completare il processo che hai iniziato ... per prima cosa, sembra che il tuo liblife.a abbia lo stesso file aggiunto due volte. Proverei a cancellare quel file e a ricrearlo, o semplicemente saltando quel passaggio e passando i file .o al linker direttamente senza prima averli inseriti in un file .a. Questo semplificherà un po 'le cose.

L'altra mia domanda è: perché sta tentando di estrarre la D principale? C'è un main() nel tuo codice .d da qualche parte? Se è così, va bene, ma dovrai rimuovere quello dal tuo codice C++. (Forse rinominarlo in cppmain e quindi chiamare dalla D principale:

codice D:

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

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

E che trasmette al vostro C++ principale Se si desidera rimuovere il principale D (ammesso che sia. lì, se non me lo faccia sapere e cercherò di pensare cos'altro potrebbe causare tale errore linker), prima di utilizzare il codice tou D in C++, si desidera inizializzare D. Quindi: codice

D:

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

C++ codice:

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

Se non si esegue questa operazione, la chiamata di funzioni D può causare un segfault.

Ma per riassumere, sono abbastanza sicuro di avere un file .o duplicato aggiunto al tuo archivio e il principale definito in D e C++. Eliminare il duplicato nell'archivio e uccidere uno dei duplicati principali e si dovrebbe avere un certo successo.

+0

Prima di vedere la tua risposta, scopro che come linker è necessario usare 'dmd'. Ho provato a collegare il codice quando la funzione principale descritta nel codice C++. In questo caso, ho ottenuto il file binario e all'avvio ha ottenuto il segfault, che avvisa. Ora, dopo aver letto il tuo post, ho provato a creare una funzione principale nel codice D e a chiamare dalla funzione cppmain, come hai scritto tu. In tal caso, dopo il collegamento ottengo anche il binario, che è anche quando inizia a ottenere un segfault, ma questa volta backtrace molto più abbondante, e indica che si verifica un errore al momento del rinvio ai metodi di una classe D CompleteAutomata –

+0

Un errore comune quando si arriva a D da C++ è che le classi D devono sempre essere allocate come heap, quindi assicurati di fare: CompleteAutomata a = new CompleteAtomata() ;, e non solo CompleteAutomata a ;. La ragione è che le classi in D sono sempre fatte per riferimento (MyClass a in D è più simile a MyClass * a in C++), quindi se non lo si inizializza con new, il riferimento sarà nullo e segfault quando lo si utilizza. –

+0

un'altra nota, le classi D dovrebbero essere new'd da D, e le classi C++ dovrebbero essere costruite in C++. C'è un modo per aggirare questo, ma le lingue non sanno come chiamare i costruttori l'uno dell'altro, quindi dovresti farlo manualmente per inizializzare l'oggetto. Tuttavia è molto più semplice aggiungerlo semplicemente nella loro lingua madre. –

Problemi correlati