Как скомпилировать файлы D и C *.o с помощью GCC
Я пытаюсь связать код D и C, используя компилятор DMD и GCC. До сих пор я пробовал использовать компилятор DMD для компиляции исходного кода в файлы *.o, компилятор GCC для компиляции исходного кода 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. Как включить это при связывании?
1 ответ
Ответ, который я придумал, нет.
Просто используйте 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.