【问题标题】:How to compile D and C *.o files with GCC如何使用 GCC 编译 D 和 C *.o 文件
【发布时间】:2023-03-08 06:48:01
【问题描述】:

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

【问题讨论】:

    标签: c gcc d dmd


    【解决方案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 桥接头,列出你想通过 extern (C) 语法使用的所有 C 函数

    例如

    mycfile.c

    int myfunction() {
        return 3;
    }
    

    mycbridge.d

    extern (C) int myfunction();
    

    然后在你的 D 源中包含 mycbridge.d。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多