好的,我目前正在玩 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/