macos - 分离编译和链接 - 在 D 中

标签 macos gcc d dmd

好的,我目前正在玩 D(第一次),所以我想我会遇到一些非常基本的问题......我在这里......:-)

当我使用 dmd 编译链接时,它编译正常:

dmd myMain.d myTestModule.d

当设置 -v(详细)标志时,我注意到该过程基本上是一个编译步骤(使用 -c 标志)和链接(使用 gcc ) 和往常一样。

但是,当我尝试以下列方式编译时,我不断收到错误:

dmd -c MyMain.d myTestModule.d
gcc MyMain.o -o MyMain -m64 -lphobos2 -lpthread -lm

Undefined symbols for architecture x86_64:
  "_D8someFunc3strFmZAya", referenced from:
      __Dmain in MyMain.o
ld: symbol(s) not found for architecture x86_64
collect2: ld returned 1 exit status

这是怎么回事?有什么想法吗?

最佳答案

编译 生成可能引用外部符号的目标文件。 链接 是将一组相关目标文件组合成单个二进制文件的过程,处理它们之间的所有外部引用,以及其他任务。

每个源文件被编译成一个匹配的目标文件。在你的例子中,你已经编译了 myMain.d 和 myTestModule.d,所以出现了两个目标文件:myMain.o 和 myTestModule.o。但是您只将其中一个提供给链接器(通过 gcc),这可以预见会导致某些符号无法解析。

gcc myMain.o myTestModule.o -o MyMain -m64 -lphobos2 -lpthread -lm

...应该可以解决问题。

另请注意,您可以使用完全相同的 dmd 二进制文件来调用链接器,它会负责为您链接默认内容(phobos、pthread 等):

dmd myMain.o myTestModule.o -o MyMain -m64

关于macos - 分离编译和链接 - 在 D 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14650660/

相关文章:

c++ - 在 system() 函数中获取输入 (Mac)

java - MacOS Jenkins : Locating JRE and importing self-signed certificate

c - GCC x86 内联汇编中的 (+r) 与 (=r) 约束

ide - 带自动格式化功能的 D IDE

linux - 方法调用顺序混淆

swift - WKWebView 在 OSX 上显示空白屏幕,没有输出

macos - SwiftUI macOS 工具栏图标对齐三栏布局

gcc - C 交叉编译器中的分段内存模型

c++ - 带有旧版本库的 MinGW

ubuntu - 为什么链接器找不到 tcl/tk?