分离编译和链接 - 在D中

Dr.*_*eon 2 macos gcc d dmd

好吧,我现在正在玩D(这是第一次),所以据说我会有一些超基本的问题...而且我在这里...... :-)

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

dmd myMain.d myTestModule.d
Run Code Online (Sandbox Code Playgroud)

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

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

dmd -c MyMain.d myTestModule.d
gcc MyMain.o -o MyMain -m64 -lphobos2 -lpthread -lm
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)

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

Mih*_*uns 6

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

每个源文件都编译成一个匹配的目标文件.在您的情况下,您已经编译了myMain.d和myTestModule.d,因此出现了两个目标文件:myMain.o和myTestModule.o.但是你只提供其中一个链接器(通过gcc),并且可预测会导致某些符号未解析.

gcc myMain.o myTestModule.o -o MyMain -m64 -lphobos2 -lpthread -lm
Run Code Online (Sandbox Code Playgroud)

......应该做的伎俩.

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

dmd myMain.o myTestModule.o -o MyMain -m64
Run Code Online (Sandbox Code Playgroud)