Scons не собирает простую D-программу в OSX - PullRequest
3 голосов
/ 28 марта 2012

Я получаю сообщение об ошибке при попытке использовать Scons для создания простого D-файла. Я проверил scons, создав простой файл helloworld.c, но аналога в 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!");
}

EDIT:

Полный вывод 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 Ответ

4 голосов
/ 29 марта 2012

После того, как я понял, что вывод говорит мне благодаря комментарию, я немного поигрался с файлами конфигурации и получил желаемый результат.Я чувствую, что это обходной путь, который несколько подрывает «круиз-контроль», к которому стремится 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.

...