2015-06-10 4 views
4

Я пытаюсь связать код D и C с использованием компилятора DMD и GCC. Я пытался использовать компилятор DMD для компиляции источника в * .o-файлы, используя компилятор GCC для компиляции источника C в файлы * .o и используя GCC для связывания для создания двоичного файла.Как скомпилировать файлы D и C * .o с помощью GCC

Однако, последний шаг дает мне ошибки компоновщика, давая мне несколько «неопределенного символа для архитектуры» ошибки

dmd ../src/Main.d -I../src -c 
gcc -c ../ext/clibs.c 
gcc *.o -o Main 
Undefined symbols for architecture x86_64: 
    "_D10TypeInfo_k6__initZ", referenced from: 
     _D11TypeInfo_xk6__initZ in Main.o 
    "_D12TypeInfo_Aya6__initZ", referenced from: 
     _D13TypeInfo_xAya6__initZ in Main.o 
    "_D14TypeInfo_Const6__vtblZ", referenced from: 
     _D11TypeInfo_xk6__initZ in Main.o 
     _D13TypeInfo_xAya6__initZ in Main.o 
    "_D3std5stdio12__ModuleInfoZ", referenced from: 
     _D4Main12__ModuleInfoZ in Main.o 
    "__d_arraybounds", referenced from: 
     _D6object7__arrayZ in Main.o 
     _D4core4stdc6stdint7__arrayZ in Main.o 
     _D3std8typecons7__arrayZ in Main.o 
     _D3std6traits7__arrayZ in Main.o 
     _D3std9typetuple7__arrayZ in Main.o 
    "__d_assert", referenced from: 
     _D6object8__assertFiZv in Main.o 
     _D4core4stdc6stdint8__assertFiZv in Main.o 
     _D3std8typecons8__assertFiZv in Main.o 
     _D3std6traits8__assertFiZv in Main.o 
     _D3std9typetuple8__assertFiZv in Main.o 
    "__d_run_main", referenced from: 
     _main in Main.o 
    "__d_unittest", referenced from: 
     _D6object15__unittest_failFiZv in Main.o 
     _D4core4stdc6stdint15__unittest_failFiZv in Main.o 
     _D3std8typecons15__unittest_failFiZv in Main.o 
     _D3std6traits15__unittest_failFiZv in Main.o 
     _D3std9typetuple15__unittest_failFiZv in Main.o 

Я предполагаю, что файл D * .o относится к символам в библиотеке STD D , Как включить это при связывании?

ответ

2

Ответ: Я придумал, не надо.
Просто используйте DMD компилятор для последнего шага

Таким образом, вместо

dmd ../src/Main.d -I../src -c 
gcc -c ../ext/clibs.c 
gcc *.o -o Main 

Просто

dmd ../src/Main.d -I../src -c 
gcc -c ../ext/clibs.c 
dmd *.o 

Вы еще написать D моста заголовок, содержащий все функции C вы хотите использовать с синтаксисом extern (C)

Например

mycfile.c

int myfunction() { 
    return 3; 
} 

mycbridge.d

extern (C) int myfunction(); 

, а затем включить mycbridge.d в источнике D.