GCCにstdinの読み込みを依頼することができます。そのドキュメントのInvoking GCCの章を読んでください。 /dev/stdin
または-
とその-x
optionを使用します。
echo 'int main(){return 0;}' | g++ -x c++ -O -Wall -o myprog /dev/stdin
ところで、int main(){return 0;}
が有効なCプログラムですので、あなたがプログラムにより
echo 'int main(){return 0;}' | gcc -x c -O -Wall -o myprog -
を使用することができ、あなたがのために、いくつかのFILE*
ハンドルを取得するpopen(3)を使用することを検討すべきですpipe(7)(だからFILE* f = popen("g++ -x c++ -O -Wall -o myprog /dev/stdin", "w");
)f
がヌルでないことを確認してfprintf
を入力し、最後にpclose
にします。 pclose
の状態をテストすることを忘れないでください。
しかし、GCCが費やす時間のほとんどはparsingではありません(調べるには-ftime-report
developer optionを使用してください)。 optimize(例:-O2 -march=native
またはちょうど-O
)に問い合わせたい場合は、すべてwarnings(少なくとも-Wall
、おそらくは-Wextra
)と尋ねることをお勧めします。
あなたは、Linux上でdynamically loadedする/tmp/myemitted.cc
にいくつかの放射されたC++コードから/tmp/someplugin.so
にいくつかのpluginコードを生成し、例えばとshared object dynamic libraryにposition-independent codeとしてコンパイルしたい場合
g++ -o /tmp/someplugin.so -fPIC -shared -Wall -O /tmp/myemitted.cc
など....その後、いくつかのロードされたシンボルを取得するためにdlsym(3)で/tmp/someplugin.so
にdlopen(3)を使用しています。私のGCC MELTがこれをやっています。
時間を解析すると無視できるので、あなたの代わりにそれへの書き込みは、ディスクを必要としない、多くの場合、ほとんどのLinuxシステム上でいくつかの高速tmpfsのある/tmp/
または/run
内部のいくつかの一時ファイル(でCまたはC++のコードを書くことができI/O)。
最後に、最近のGCC(少なくともGCC 6を使用)にはGCCJIT(実際にはlibgccjit)があります。生成されたコードの表現を作成し、GCCにコンパイルを依頼することができます。
thisおよびthatも参照してください。/tmp/
の下で一般にもいくつかのランダムなファイル名を私はむしろmkstemp(3)などを参照してください(ファイル
は一時ファイルを生成しない...とあなたが事実上できたC++ dlopen mini howtoとProgram Library HowTo、およびDrepperのHow To Write Shared Libraries
を読みます.c
で終わってから、にいくつかの機能を渡して登録を登録してください。unlink(2) ...)は本当に速いですが、C++またはCコードをメモリに書き出す前にメモリにASTを作成する必要があります。また、Makefile
を使用して生成されたコードをmake
commandでコンパイルすると、(上級ユーザーのために)Makefile
を編集してmake
を編集することによってコンパイラーやオプションを変更できるという利点があります。
一時ファイルを避けるのが間違っています(gcc
& g++
も、一部のアセンブラコードを含むような一時ファイルを生成して削除しています)。逆に、乱数を使用して一時ファイル(/tmp/mytemp*.cc
と一致)を生成することをお勧めします(random(3)を参照してください:main
の早めにsrandom(time(NULL));
などのPRNGを入力することを忘れないでください)。あなたがコード化された
char tmpbuf[80];
bool unique;
do { // in practice, this loop is extremely likely to run once
snprintf(tmpbuf, sizeof(tmpbuf), "/tmp/mytemp_%lx_p%d.cc",
random(), (int)getpid());
unique = access(tmpbuf, F_OK);
} while (unique);
// here tmpbuf contains a unique temporary file name
のような単純なものでした:(+ "-o run.outを "code_string +" G ++ -C")
システム。
通常、+
は文字列カテーションではありません。文字列を作成するには、snprintf(3)またはasprintf(3)を使用します。またはC++ std::stringで使用してください。あなたがsystem(3)を使用している場合、あなたはその戻りコードをチェックする必要があります
char cmdbuf[128];
snprintf(cmdbuf, sizeof(cmdbuf), "g++ -Wall -O %s -o run.out", tmpbuf);
fflush(NULL);
if (system(cmdbuf) != 0) {
fprintf(stderr, "compilation %s failed\n", cmdbuf);
exit(EXIT_FAILURE);
}
はところで、あなたの例は、(<stdio.h>
を逃す)間違っています。それはCコードであり、C++コードではありません。それは
echo -e '#include <stdio.h>\nint main(){printf("Hello World"); return 0;}' \
| gcc -x c -Wall -O -o myprog -
PSでなければなりません。私の答えはLinuxに重点を置いていますが、あなたのOSに合わせることができます。
オペレーティングシステムとGCCのバージョンはどちらですか? –
なぜあなたは尋ねていますか?それは何の動機ですか?私が知っていれば私の答えを改善することができました。だからあなたの質問を編集してください* –
私はgcc 4.8.4とubuntu 14.04を使用しています。 プログラム内でコードをコンパイルできるようにしたいのですが、未使用のファイル名を確認したり、ファイルを作成したり、コマンドを実行したり、ファイルを削除したりする必要はありません。 – ClemsonCoder