おもちゃ言語用のカスタムコンパイラはCraneliftを使用してファイルに書き込むことができるオブジェクトコードを生成しますmain.o
。このオブジェクトファイルを実行可能にするにはgcc -o main main.o
。
しかし、一時オブジェクトファイルをディスクに書き込むのを避けるために、コードをGCCに直接パイプしたいので、コンパイラにオブジェクトコードを標準出力に書き込むようにしました。オプションにターゲットファイルの値がないように見えるため、ファイル名としての使用は-
機能しません。-x
一種のシェルリダイレクトを使用することも機能しません:error 。gcc -o main <(compiler)
with/usr/bin/ld: /proc/self/fd/11: file not recognized: Illegal seek
gcc -xc <(echo "int main(){}") -o main
-pipe
GCCを使用してパイプで接続されたオブジェクトコードをリンクする方法はありますか?
ベストアンサー1
ld
検索可能なファイルが必要なため、パイプは使用できません。 Korn<(...)
シェルプロセスは、パイプに拡張されたパスを置き換えます。
通常の検索可能なファイル(背後に作成された)への=(...)
パスを取得するには、zshまたはFishが必要です。(...|psub -f)
$TMPPREFIX
$TMPDIR
gcc -o main =(compiler) # zsh
gcc -o main (compiler|psub -f) # fish
ld
必要なファイルのパス.o
がで終わる場合にzsh
設定しますTMPSUFFIX=.o
。
他のシェルでは一時ファイルを手動で生成することができ、gcc
それを呼び出したりcompiler
削除した後に出力をそのファイルにリダイレクトすることもできます。 Korn/POSIXに似たシェルでは:
file=$(mktemp) && {
rm -f -- "$file" &&
compiler >&3 3>&- 4<&- &&
gcc -o main /dev/fd/4 3>&-
} 3> "$file" 4<> "$file"
自己処理のために独自に多くの一時ファイルを生成するので、gcc
ここで追加の一時ファイルの生成を避けようとすることは意味がありません。