当我尝试使用Scons构建一个简单的D文件时,我收到了一个错误。我已经通过构建一个简单的helloworld.c测试了scons,但D中的等价物并没有发生,而且我对Scons不够聪明,不知道它是我的设置中的错误还是问题。
我收到的错误是ld: library not found for -lphobos
我的SConstruct文件:
SConscript('SConscript', variant_dir='release', duplicate=0, exports={'MODE':'release'})
SConscript('SConscript', variant_dir='debug', duplicate=0, exports={'MODE':'debug'})
我的SConscript文件:
env = Environment()
env.Program(target = 'helloworld',
source = ['hello.d'])
hello.d的
import std.stdio;
void main() {
writeln("Hello, world!");
}
编辑:
完整的scons输出是:
MyComputer:thedbook me$ scons
scons: Reading SConscript files ...
scons: done reading SConscript files.
scons: Building targets ...
scons: building associated VariantDir targets: release debug
gcc -o debug/helloworld debug/hello.o -L/usr/share/dmd/lib -L/usr/share/dmd/src/druntime/import -L/usr/share/dmd/src/phobos -lphobos -lpthread -lm
ld: library not found for -lphobos
collect2: ld returned 1 exit status
scons: *** [debug/helloworld] Error 1
scons: building terminated because of errors.
我感到困惑的原因是正常构建文件很简单(这是一个文件helloworld案例):
$ dmd hello.d -v
binary dmd
version v2.058
config /usr/bin/dmd.conf
parse hello
importall hello
... <significant amount of imports here> ...
code hello
function D main
function std.stdio.writeln!(string).writeln
function std.stdio.writeln!(string).writeln.__dgliteral834
function std.exception.enforce!(bool,"/usr/share/dmd/src/phobos/std/stdio.d",1550).enforce
gcc hello.o -o hello -m64 -Xlinker -L/usr/share/dmd/lib -lphobos2 -lpthread -lm
请注意,我必须在编译器上启用详细程度才能让它显示任何内容。通常它会静默地构建和链接文件。
答案 0 :(得分:4)
在通过评论意识到输出告诉我的内容后,我使用配置文件玩了一下,得到了我想要的结果。我觉得这是一个解决方案,有点破坏了SCons所要求的“巡航控制”的事情,但我得到了一个构建,所以我不能抱怨。
我不得不修改我的SConscript文件,如下所示:
env = Environment()
target = 'helloworld'
sources = ['hello.d']
libraries = ['phobos2', 'pthread', 'm']
libraryPaths = ['/usr/share/dmd/lib',
'/usr/share/dmd/src/druntime/import',
'/usr/share/dmd/src/phobos']
env.Program(target = target,
source = sources,
LIBS = libraries,
LIBPATH = libraryPaths)
这里的关键变化是添加LIBS并明确写出要包含哪些库,而不是依靠SCons来解决它。不幸的是,当你添加一个时,你必须明确地链接它们。不过,希望能帮助其他想要用D和SCons快速跑步的人。