如何使用GCC编译D和C的*.o文件

4

我正在尝试使用DMD和GCC编译器链接D代码和C代码。

到目前为止,我尝试使用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个回答

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();

然后在您的D源代码中包含mycbridge.d文件。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接