2

我正在为自己编写一个库,以帮助自动化我在 D 中一直在执行的一些非常常见的任务,用于从命令行编写脚本。作为参考,这里是完整的代码:

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,如果这有帮助的话。

4

1 回答 1

4

这些错误消息来自 OPTLINK,链接器 D 用于编译 32 位 Windows 程序。

如果您尝试将库编译为.lib文件,则需要在编译后使用-lib编译器开关来调用库管理器(而不是链接器)。(从技术上讲,DMD 的图书管理员内置于编译器中,因此它.lib直接发出。)

如果您只想将一个模块编译为.obj文件,请使用该-c选项来禁止调用链接器。

如果两者-lib都没有-c指定,DMD 将在编译后调用链接器,它会尝试将您的源文件构建成可执行程序。如果您的源文件都不包含入口点(main函数),则链接器将抱怨“无起始地址”。

如果您尝试构建一个使用您的库的程序,并且仅在调试模式下出现链接错误,则可能表明链接器找不到标准库的调试版本。此设置使用-debuglib开关指定,通常与非调试库相同(也可以使用-defaultlib开关指定)。

于 2014-02-05T11:49:07.220 回答