2

好的,我目前正在和 D 一起玩(第一次),所以据说我会有一些超基本的问题......我在这里...... :-)

当我用它编译链接时,dmd它编译得很好:

dmd myMain.d myTestModule.d

设置-v(verbose) 标志时,我注意到该过程基本上是一个编译步骤(带有-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

这是怎么回事?有任何想法吗?

4

2 回答 2

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
于 2013-02-01T22:03:38.570 回答
2

您还需要链接到myTestModule.o. 每个文件dmd -c生成一个文件。而且您只是链接您创建的两个之一。.o.d

于 2013-02-01T20:54:08.533 回答