5

Windows で SCons と MinGW を使用して gcc と gfortran オブジェクトから共有ライブラリを構築しようとしていますが、最終的なリンクでコマンド ラインが 18000 文字を超えて長すぎます。コマンド ラインを渡すために一時ファイル (応答ファイル?) を使用する必要があることはわかっていますが、SCons にこれを直接実行させる方法が見つかりません。私はこのライブラリに CMake を使用していましたが、干渉することなく応答ファイルを処理しました。

SCons は CommandGeneratorAction を使用して共有ライブラリ コマンド ラインを生成しているようです。このアクションに応答ファイル メカニズムを使用するように指示する方法はありますか? 私が見落としている長いコマンドラインを処理する別の方法はありますか?

関連する SConscript:

sqllib = env.SharedLibrary(target='fvssql', source=sqllib_sources, LIBS=['odbc32',])
ffelib = env.SharedLibrary(target='fvspncffe', source=ffelib_sources, LIBS=[sqllib,], LIBPATH=['.',])

fvsobjs = env.SharedObject(fvslib_sources)
fvsobjs = [obj for obj in fvsobjs if obj.get_suffix()=='.o']

fvslib = env.SharedLibrary(target='fvspnc', source=fvsobjs, LIBS=sqllib+ffelib, LIBPATH=['.',])

env.Dump() からの関連出力:

'SHLIBSUFFIX': '.dll',
'SHLINK': '$LINK',
'SHLINKCOM': <SCons.Action.CommandGeneratorAction object at 0x02DDF770>,
'SHLINKFLAGS': ['$LINKFLAGS', '-shared'],

自分の環境env['SHLINKCOM']="${TEMPFILE('$SHLINK -o $TARGET ... $SOURCE')}"でコマンド ライン テンプレートを準備することはできましたが、これは脆弱なようで、できれば SCons に処理させたいと考えています。

文字列置換 を使用してみenv['SHLINKCOM']='${TEMPFILE("%s")}' % (env['SHLINKCOM'],)ましたが、結果は不完全なコマンドラインであり、とにかく応答ファイルになりました。

編集

LongCmdLinesOnWin32の回避策を見てきました。可能であれば、TEMPFILE、TempFileMunge、コマンドライン間接化メカニズムを使用したいと思います。

4

1 に答える 1

1

http://scons.org/wiki/LongCmdLinesOnWin32を見たことがありますか?リンクフェーズでの長いコマンドリングに関する正確な問題に対する答えがあるようです。

于 2012-11-19T18:08:24.887 に答える