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

これらのエラー メッセージは、リンカ D が 32 ビット Windows プログラムのコンパイルに使用する OPTLINK からのものです。

.libライブラリをファイルにコンパイルしようとしている場合は、-libコンパイラ スイッチを使用して、コンパイル後に (リンカーではなく) ライブラリアンを呼び出す必要があります。(技術的には、DMD のライブラリアンはコンパイラに組み込まれているため、.lib直接出力されます。)

1 つのモジュールのみを.objファイルにコンパイルする場合は、-cオプションを使用してリンカーの呼び出しを抑制します。

どちらも指定されていない場合-lib-cDMD はコンパイル後にリンカーを呼び出し、ソース ファイルを実行可能プログラムにビルドしようとします。どのソース ファイルにもエントリ ポイント (main関数) が含まれていない場合、リンカは「開始アドレスがありません」と文句を言います。

ライブラリを使用するプログラムをビルドしようとしていて、デバッグ モードでのみリンク エラーが発生する場合は、リンカーが標準ライブラリのデバッグ バージョンを見つけられないことを示している可能性があります。この設定は-debuglibスイッチで指定するもので、通常は非デバッグライブラリ(-defaultlibスイッチでも指定可能)と同じです。

于 2014-02-05T11:49:07.220 に答える