分离编译和链接 - 在D中

时间:2013-02-01 16:24:04

标签: 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

发生了什么事?有什么想法吗?

2 个答案:

答案 0 :(得分:6)

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

每个源文件都编译成一个匹配的目标文件。在您的情况下,您已经编译了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

答案 1 :(得分:2)

您还需要在myTestModule.o中进行链接。 dmd -c为每个.o文件生成.d个文件。而且你只是链接你创建的两个中的一个。