2016-07-11 7 views
0

コードをgccに直接渡すことはできますか?もしそうなら、そのためのコマンドラインオプションは何ですか?例えばコードをgccに直接渡すことはできますか?例:gcc - ? 'int main(){return 0;}'

私はシステムコマンドを使用していますが、私はむしろ、ファイルを作成していないので、私は知っている必要があり
g++ -? 'int main(){return 0;}' 

system("g++ -C "+code_string+" -o run.out"); 

バジーレStarynkevitchソリューションが働いていたが、私はコンパイルエラーを取得しています、私は、改行を使用する場合:

echo '#include\nint main(){printf("Hello World"); return 0;}' | g++ -x c++ -Wall -o myprog /dev/stdin 

を編集:固定それ

echo -e '#include\nint main(){printf("Hello World"); return 0;}' | g++ -x c++ -Wall -o myprog /dev/stdin 
+0

オペレーティングシステムとGCCのバージョンはどちらですか? –

+0

なぜあなたは尋ねていますか?それは何の動機ですか?私が知っていれば私の答えを改善することができました。だからあなたの質問を編集してください* –

+0

私はgcc 4.8.4とubuntu 14.04を使用しています。 プログラム内でコードをコンパイルできるようにしたいのですが、未使用のファイル名を確認したり、ファイルを作成したり、コマンドを実行したり、ファイルを削除したりする必要はありません。 – ClemsonCoder

答えて

2

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-reportdeveloper optionを使用してください)。 optimize(例:-O2 -march=nativeまたはちょうど-O)に問い合わせたい場合は、すべてwarnings(少なくとも-Wall、おそらくは-Wextra)と尋ねることをお勧めします。

あなたは、Linux上でdynamically loadedする/tmp/myemitted.ccにいくつかの放射されたC++コードから/tmp/someplugin.soにいくつかのpluginコードを生成し、例えばとshared object dynamic libraryposition-independent codeとしてコンパイルしたい場合

g++ -o /tmp/someplugin.so -fPIC -shared -Wall -O /tmp/myemitted.cc 

など....その後、いくつかのロードされたシンボルを取得するためにdlsym(3)/tmp/someplugin.sodlopen(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 howtoProgram 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に合わせることができます。

+0

完全なものですが、 '-mcpu'は廃止予定です。 '-mtune'や(できれば)' -march'を使います。 – Tim

+0

ありがとうございます。修正されました –

+0

それは新しい行を除いて、私の投稿を更新しました。 エコー '#include \ nint main(){printf( "Hello World"); return 0;} '| g ++ -x C++ -Wall -o myprog/dev/stdin – ClemsonCoder

関連する問題