2014-02-05 2 views
2

Я писал для себя библиотеку, чтобы помочь автоматизировать некоторые действительно общие задачи, которые я делал в D для сценариев из командной строки. Для справки, вот код в полном объеме:D: dmd говорит что-то действительно странное

module libs.script; 

import std.stdio: readln; 
import std.array: split; 
import std.string: chomp; 
import std.file: File; 

//Library code for boring input processing and process invocation for command-line scripting. 

export: 
//Takes the args given to the program and an expected number of arguments. 
//If args is lacking, it will try to grab the arguments it needs from stdin. 
//Returns the arguments packed into an array, or null if malformed or missing. 
string[] readInput(in string[] args, in size_t expected) { 
string[] packed = args.dup; 
if (args.length != expected) { 
    auto line = split(chomp(readln()), " "); 
    if (line.length == (expected - args.length)) 
     packed ~= line; 
    else 
     packed = null; 
} 
return packed; 
} 

//Digs through the .conf file given by path_to_config for a match for name_to_match in the first column. 
//Returns the rest of the row in the .conf file if a match is found, and null otherwise. 
string[] readConfig (in string path_to_config, in string name_to_match) { 
string[] packed = null; 
auto config = File(path_to_config,"r"); 
while (!config.eof()) { 
    auto line = split(chomp(config.readln()), ":"); 
    if (line[0] == name_to_match) 
     packed = line[1..$]; 
    if (packed !is null) 
     break; 
} 
config.close(); //safety measure 
return packed; 
} 

Теперь, когда я пытаюсь скомпилировать это в режиме отладки (DMD -debug), я получаю сообщение об ошибке:

Error 42: Symbol Undefined __adDupT 
script.obj(script) 
Error 42: Symbol Undefined __d_arrayappendT 
script.obj(script) 
Error 42: Symbol Undefined _D3std5stdio4File6__dtorMFZv 
script.obj(script) 
Error 42: Symbol Undefined _D3std5stdio4File3eofMxFNaNdZb 
script.obj(script) 
Error 42: Symbol Undefined __d_framehandler 
script.obj(script) 
Error 42: Symbol Undefined _D3std5stdio4File5closeMFZv 
script.obj(script) 
Error 42: Symbol Undefined _D3std6string12__ModuleInfoZ 
script.obj(script) 
Error 42: Symbol Undefined _D3std5stdio12__ModuleInfoZ 
OPTLINK : Warning 134: No Start Address 
--- errorlevel 36 

У меня есть абсолютно не знаю, что я сделал не так. Я использую Windows 7, если это вообще помогает.

+0

Предупреждение 134 означает, что вы компилируете приложение, а не библиотеку. –

ответ

4

Эти сообщения об ошибках поступают из OPTLINK, используемый компоновщиком D для компиляции 32-разрядных программ Windows.

Если вы пытаетесь скомпилировать свою библиотеку в файл .lib, вам необходимо использовать переключатель компилятора , чтобы вызвать библиотеку (вместо компоновщика) после компиляции. (Библиотекарь технически DMD построен в компилятор, так что он испускает .lib непосредственно.)

Если вы предназначены только для компиляции одного модуля к .obj файлу, используйте опцию -c для подавления вызова компоновщика.

Если ни -lib, ни -c указаны, DMD будет ссылаться на компоновщик после компиляции, который попытается создать исходные файлы в исполняемую программу. Если ваш ни один из ваших исходных файлов не содержит точку входа (main), компоновщик будет жаловаться на «No Start Address».

Если вы пытаетесь создать программу, которая использует вашу библиотеку, и вы получаете ошибки ссылок только в режиме отладки, это, вероятно, указывает на то, что компоновщик не может найти отладочную версию стандартной библиотеки. Этот параметр задается с помощью переключателя -debuglib, и обычно он такой же, как и библиотека без отладки (которая также может быть указана с помощью переключателя -defaultlib).

+0

. Я тонкий, как правило, проще всего (и лучше всего) просто скомпилировать все ваши файлы вместе, так что 'dmd mainfile.d otherfile.d helperfile.d commontasks. d' и т. д. Это позволяет избежать проблем с отдельными сборками библиотек и, как правило, строить быстрее, чем делать их отдельно (он может кэшировать таблицы импорта и параллельно делать другие файлы) –

 Смежные вопросы

  • Нет связанных вопросов^_^