2013-07-14 11 views
6

Kürzlich habe ich die schöne Sprache D gelernt, die so plastischer ist und dir beim Schreiben stabiler schneller Programme hilft. Aber es ist nicht populär ... weil wenig Code auf D geschrieben ist und so mehr auf C und C++. Deshalb, nachdem ich das Buch von Andrei Alexanderscu gelesen habe, wo Autor sehr oberflächlich Frage über die Verknüpfung von D-Bibliothek mit C++ - Code beschrieben habe, versuchte ich es selbst zu lernen und schrieb einen Code auf D, wo definierte Funktion eine Instanz der CompleteAutomata-Klasse zurückgibt, die auch AutomataInterface definiert in C++ Code:D-Bibliothek mit C++ Code verbinden

#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 

Relevante D-Code:

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

nach Code geschrieben hatte, habe ich von zwei verschiedenen Compilern von D Bibliothek Kompilieren (dmd und gdc), mit folgenden Flags:

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

oder

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

Wenn ich direkt durch Hinzufügen Pfad zur Bibliothek dir (-L Option) und das Hinzufügen eines lib Link jeweils empfangenen Libs zu Qt-Projekt versucht (-l Option). Ich habe Fehler in beiden Fällen.

Im ersten dmd Fall I "undefined reference to` _d_newclass'" haben und ein paar weitere Fehler:

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

Im zweiten Fall (wenn gdc verwendet wird) empfängt I Nachricht über "mehrere Definition des Begriffs":

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

nach zwei Tagen versucht, dies zu tun ...

Kürzlich habe ich versuchen, Phobos (D-Standard-Bibliothek) zu verknüpfen Prozess hinzufügen. Für dmd -lphobos2 Flagge und für gdc -lgphobos2 Flagge entsprechen. Aber es hilft mir nicht ...

Bei der Verwendung von dmd Linker Ausgang:

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 

und ich habe versuchen Ersatz von libcurl-gnutls: ln -s /usr/lib64/libcurl.so.4 /usr/lib64/libcurl-gnutls.so.4. Dann Ergebnis der Verknüpfung derselben, aber ohne Nachricht über libcurl-gnutls.

Bei der Verwendung von gdc Linker Ausgang wieder über "mehr Definition zu" sprechen:

/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 

mit Meldung über librt.so.1 am Ende. Ich inspiziere/usr/lib64 und sehe dort die Bibliotheksdatei.

Liebe Magie, bitte sagen Sie mir, wie Sie die D-Bibliothek mit C++ - Code verbinden.

Antwort

9

Im Allgemeinen ist es einfacher der D-Compiler die Verknüpfung tun zu lassen:

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

Genauso gut könnte man curl, um es hinzuzufügen hat, genau wie zuvor.Um ein Linker Argument durch DMD passieren (oder gdmd wenn Sie gdc verwenden, sollten auf die gleiche Weise arbeiten), übergeben -Larg

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

Es ist in der Regel einfacher zu setzen main() in D zu (es kann nur rufen Sie auch sofort eine C++ - definierte Funktion auf, weil Sie sonst wahrscheinlich die D-Runtime initialisieren müssen, bevor Sie sie aus C++ verwenden.

Aber um den Prozess zu beenden, haben Sie begonnen ... erste Sache, sieht aus wie Ihre liblife.a hat die gleiche Datei zweimal hinzugefügt. Ich würde versuchen, diese Datei zu löschen und neu zu erstellen, oder einfach diesen Schritt überspringen und die .o-Dateien direkt an den Linker übergeben, ohne sie zuerst in ein .a einzupacken. Das wird die Dinge ein wenig vereinfachen.

Meine andere Frage ist: Warum versucht es, das D-Haupt zu ziehen? Gibt es irgendwo einen main() in deinem .d Code? Wenn ja, ist das in Ordnung, aber Sie müssen das aus Ihrem C++ - Code entfernen. (Vielleicht ist es in cppmain umbenennen und dann rufen Sie aus dem D Haupt:

D-Code:

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

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

Und das wird uns auf Ihre C++ Haupt Wenn Sie die D Haupt entfernen möchten (vorausgesetzt, es ist. wenn nicht dort, lassen Sie mich wissen, und ich werde versuchen, zu denken, was sonst noch, dass die Linker-Fehler verursachen könnten), vor dem Einsatz D Code tou in C++, möchten Sie D. initialisieren So:

D-Code:

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

C++ code:

Wenn Sie dies nicht tun, kann das Aufrufen von D-Funktionen zu einem segfault führen.

Aber um es zusammenzufassen, ich bin mir ziemlich sicher, dass Sie eine doppelte .o-Datei zu Ihrem Archiv hinzugefügt haben und in D und C++ definiert sind. Löschen Sie das Duplikat im Archiv und löschen Sie eines der Duplikate und Sie sollten etwas Erfolg haben.

+0

Bevor ich Ihre Antwort sehe, finde ich heraus, dass als Linker 'dmd' verwenden muss. Ich habe versucht, Code zu verknüpfen, wenn die Hauptfunktion in dem C++ - Code beschrieben wird. In diesem Fall habe ich die Binärdatei und beim Start wurde sie segfault, was Sie warnen. Nun, nach dem Lesen Ihres Beitrags habe ich versucht, eine Hauptfunktion in D-Code zu erstellen und von ihr cppmain-Funktion aufzurufen, wie Sie geschrieben haben. In diesem Fall erhalte ich nach dem Linken auch die Binärdatei, die auch beim Start einen segfault erhält, aber dieses Mal viel häufiger, und es zeigt an, dass zum Zeitpunkt des Verweises auf die Methoden eines D-Klasse CompleteAutomata ein Fehler auftritt –

+0

Ein häufiger Fehler, wenn Sie von C++ nach D kommen, ist, dass D-Klassen immer Heap zugeordnet werden müssen, also stellen Sie sicher, dass Sie tun: CompleteAutomata a = neue CompleteAtomata(); und nicht nur CompleteAutomata a ;. Der Grund dafür ist, dass Klassen in D immer als Referenz ausgeführt werden (MyClass a in D ist am ähnlichsten wie MyClass * a in C++). Wenn Sie es nicht mit new initialisieren, ist die Referenz null und segfault, wenn Sie es verwenden. –

+0

ein weiterer Hinweis, D-Klassen sollten von D neu, und C++ - Klassen sollten in C++ konstruiert werden. Es gibt zwar einen Weg, aber die Sprachen wissen nicht, wie sie die Konstruktoren des jeweils anderen aufrufen sollen. Sie müssen das also manuell tun, um das Objekt zu initialisieren. Es ist viel einfacher, es nur in seiner Muttersprache neu zu machen. –