当我使用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
发生了什么事?有什么想法吗?
答案 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
个文件。而且你只是链接你创建的两个中的一个。