Scons没有在OSX中构建简单的D程序

时间:2012-03-28 06:05:56

标签: macos d scons

当我尝试使用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 

请注意,我必须在编译器上启用详细程度才能让它显示任何内容。通常它会静默地构建和链接文件。

1 个答案:

答案 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快速跑步的人。