如何用 GCC 编译 D 和 C *.o 文件
How to compile D and C *.o files with GCC
我正在尝试 link 使用 DMD 和 GCC 编译器编写 D 和 C 代码。
到目前为止,我尝试过的是使用 DMD 编译器将源代码编译为 *.o 文件,使用 GCC 编译器将 C 源代码编译为 *.o 文件,并使用 GCC link 创建二进制。
但是,最后一步给了我 link 个错误,给我几个 "undefined symbol for architecture" 个错误
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 库中的符号。 linking 时如何添加?
答案是我想出来的,不要。
最后一步只需使用 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 桥接 header 列出你想用 extern (C) 语法使用的所有 C 函数
例如
mycfile.c
int myfunction() {
return 3;
}
mycbridge.d
extern (C) int myfunction();
然后在你的 D 源中包含 mycbridge.d。
我正在尝试 link 使用 DMD 和 GCC 编译器编写 D 和 C 代码。 到目前为止,我尝试过的是使用 DMD 编译器将源代码编译为 *.o 文件,使用 GCC 编译器将 C 源代码编译为 *.o 文件,并使用 GCC link 创建二进制。
但是,最后一步给了我 link 个错误,给我几个 "undefined symbol for architecture" 个错误
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 库中的符号。 linking 时如何添加?
答案是我想出来的,不要。
最后一步只需使用 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 桥接 header 列出你想用 extern (C) 语法使用的所有 C 函数
例如
mycfile.c
int myfunction() {
return 3;
}
mycbridge.d
extern (C) int myfunction();
然后在你的 D 源中包含 mycbridge.d。