c - 如何用 GCC 编译 D 和 C *.o 文件

标签 c gcc d dmd

我正在尝试使用 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 库中的符号。我如何在链接时包含它?

最佳答案

我想出的答案,不要。
最后一步只需使用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。

关于c - 如何用 GCC 编译 D 和 C *.o 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30746688/

相关文章:

c - 错误消息 C 中的变量声明

python - 无法在docker中安装nmslib

c++ - 如何在MSVC中实现EXCLUDE_FIRST_ARGUMENT宏?

c++ - 套接字和文件推荐的缓冲区大小

templates - 这里的冲突在哪里?

C 代码只能在某一点上运行良好

c - 后缀表达式求值 : how much stack memory is required?

c - 读取函数没有返回任何值

string - 在不分配内存的情况下在 D 中创建字符串?

enums - 你能引用一个命名的枚举,就好像它在 D 中是匿名的一样吗?