2013-07-14 48 views
6

Gần đây tôi đã học được ngôn ngữ D tuyệt đẹp, rất nhiều nhựa và giúp bạn viết các chương trình nhanh ổn định. Nhưng nó không phổ biến ... bởi vì ít mã được viết trên D và nhiều hơn nữa trên C và C++. Vì vậy sau khi tôi đọc cuốn sách của Andrei Alexanderscu, nơi tác giả đã mô tả câu hỏi về việc liên kết thư viện D với mã C++, tôi đã cố gắng học nó và viết một số mã trên D, trong đó hàm được định nghĩa trả về một thể hiện của lớp CompleteAutomata, thực hiện AutomataInterface. trong C++:Liên kết thư viện D với mã 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 

liên quan đang D:

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

sau khi mã đã viết, tôi đã biên soạn các thư viện D bởi hai trình biên dịch khác nhau (dmdgdc), với cờ sau:

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

hoặc

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

Khi tôi cố gắng liên kết mỗi libs nhận cho dự án Qt bằng cách thêm đường dẫn đến thư mục thư viện (-L tùy chọn) và thêm một lib trực tiếp (-l tùy chọn). Tôi gặp lỗi trong cả hai trường hợp.

Trong trường hợp đầu tiên dmd Tôi có "tài liệu tham khảo không xác định cho` _d_newclass'" và vài lỗi khác:

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

Trong trường hợp thứ hai (khi sử dụng gdc) Tôi nhận được thông điệp về 'nhiều định nghĩa về':

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

Sau hai ngày nỗ lực để làm như vậy ...

Gần đây tôi đã thử thêm Phobos (thư viện chuẩn D) vào quá trình liên kết. Đối với dmd cờ -lphobos2 và tương ứng với cờ gdc -lgphobos2. Nhưng nó không giúp tôi ...

Khi sử dụng dmd mối liên kết đầu ra:

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 

và tôi đã cố gắng thay thế của libcurl-gnutls: ln -s /usr/lib64/libcurl.so.4 /usr/lib64/libcurl-gnutls.so.4. Sau đó, kết quả của việc liên kết giống nhau nhưng không có thông báo về libcurl-gnutls.

Khi sử dụng gdc ra mối liên kết một lần nữa nói về "nhiều định nghĩ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 

với thông điệp về librt.so.1 lúc kết thúc. Tôi kiểm tra/usr/lib64 và thấy ở đó nó thư viện tập tin.

Ma thuật thân mến, hãy cho tôi biết cách kết nối thư viện D với mã C++.

Trả lời

9

Nói chung là dễ dàng hơn để cho trình biên dịch D làm việc liên kết:

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

Bạn có thể phải thêm curl để nó là tốt, giống như bạn đã làm trước đó.Để vượt qua một đối số mối liên kết thông qua DMD (hoặc gdmd nếu bạn đang sử dụng GDC, nên làm việc theo cách giống nhau), vượt qua -Larg

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

Nó nói chung là dễ dàng hơn để đưa main() trong D quá (nó có thể chỉ ngay lập tức gọi ra hàm C++ đã định nghĩa) bởi vì nếu không bạn sẽ phải khởi tạo thời gian chạy D trước khi sử dụng nó từ C++.

Nhưng để hoàn tất quá trình bạn đã bắt đầu ... điều đầu tiên, trông giống như liblife.a của bạn có cùng một tệp được thêm hai lần. Tôi muốn thử xóa tệp đó và tạo lại tệp đó hoặc chỉ bỏ qua bước đó và chuyển các tệp .o vào trình liên kết trực tiếp mà không cần đóng gói chúng vào .a. Điều đó sẽ đơn giản hóa mọi thứ một chút.

Câu hỏi khác của tôi là: tại sao nó cố gắng kéo chính D? Có một chính() trong mã .d của bạn một nơi nào đó? Nếu vậy, điều đó là ổn, nhưng bạn sẽ phải loại bỏ một từ mã C++ của bạn. (Có lẽ đổi tên nó thành cppmain và sau đó gọi nó từ D chính:

đang D:

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

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

Và đó sẽ chuyển tiếp đến C++ chính của bạn Nếu bạn muốn loại bỏ các chính D (giả sử nó được. ở đó, nếu không cho tôi biết và tôi sẽ cố gắng nghĩ điều gì khác có thể gây ra lỗi liên kết đó), trước khi bạn sử dụng mã D trong C++, bạn sẽ muốn khởi tạo D. Vì vậy:

Mã D:

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

C++ code:

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

Nếu bạn không làm điều đó, hãy gọi hàm D có trách nhiệm gây ra sự phân đoạn.

Nhưng để tổng hợp, tôi chắc rằng bạn có tệp trùng lặp .o được thêm vào lưu trữ của bạn và được xác định chính trong cả D và C++. Xóa bản sao trong kho lưu trữ và tiêu diệt một trong các nguồn chính trùng lặp và bạn sẽ có một số thành công.

+0

Trước khi tôi thấy câu trả lời của bạn, tôi phát hiện ra rằng khi một trình liên kết cần sử dụng 'dmd'. Tôi đã thử liên kết mã khi hàm chính được mô tả trong mã C++. Trong trường hợp như vậy, tôi nhận được nhị phân và khi bắt đầu nó có segfault, mà bạn cảnh báo. Bây giờ, sau khi đọc bài viết của bạn, tôi đã cố gắng tạo một hàm chính trong mã D và gọi từ hàm cppmain, như bạn đã viết. Trong trường hợp này, sau khi liên kết tôi cũng nhận được nhị phân, cũng là khi bắt đầu nhận được một segfault, nhưng thời gian này backtrace phong phú hơn nhiều, và nó chỉ ra rằng một lỗi xảy ra tại thời điểm giới thiệu đến các phương pháp của một lớp D CompleteAutomata –

+0

Một lỗi phổ biến khi đến D từ C++ là các lớp D luôn cần được cấp phát, vì vậy hãy chắc chắn rằng bạn đang thực hiện: CompleteAutomata a = new CompleteAtomata() ;, và không chỉ là CompleteAutomata a ;. Lý do là các lớp trong D luôn luôn được thực hiện bằng tham chiếu (MyClass a in D giống như MyClass * a trong C++), vì vậy nếu bạn không khởi tạo nó bằng mới, tham chiếu sẽ là rỗng và segfault khi bạn sử dụng nó. –

+0

một lưu ý khác, các lớp D nên được new'd từ D, và các lớp C++ nên được xây dựng trong C++. Có một cách xung quanh điều này, nhưng các ngôn ngữ không biết làm thế nào để gọi các nhà xây dựng của nhau, vì vậy bạn phải làm điều đó bằng tay để khởi tạo đối tượng. Nó là dễ dàng hơn nhiều để chỉ mới nó trong ngôn ngữ mẹ đẻ của họ mặc dù. –