Clang(+MinGW)でCソースをコンパイル(&リンク)

2015-01-09 :  PCクリニック
本文の前に、
-・・・ -・-
現時点での blogramのランクインカテゴリは、
4、3、0、1、0、 0、0、0、1、0(41)で、換算ポイント 69pt 。
「Firefox」が2日前朝方に大きくbg値がアップし4位に上がった。
しかし昨日朝方、逆にbg値が大幅ダウンで、
「C言語」「グルコサミン」が共に2位にダウン。
「Firefox」に至っては8位にまでダウン。更に今朝方9位にダウン。
相変わらず「C言語」「Firefox」「化学業界」「グルコサミン」のbg値が、
毎日の如く変動している。
・-・ - -・

さて、本文。

3週間以上前(2014-12-15)の記事:
C コンパイラ? LLVM / Clang
で、
  ・・・・・
  「clang+llvmでさりげなくすごいコードが生成されていた話。」
  (2013-06-22付)
  を見つけた。
    ・・・・・
    ここで使ったコードとその結果はgistに貼りました。
    ・・・・・
  と云うことで、
  「tetsu-koba / sum.c」
  をコピペさせて頂き、「sum.c」
  これを、DOS窓で、
    clang -o sum.exe sum.c
  でコンパイル。
  「sum.exe」が出来た。
  動きました。
  「.o」ファイルは残っていない。
  取り敢えずは、OK ?
  ところで、実際(?)のコンパイルは?
  'PATH' に登録されている「MinGW」が行っているようだ。
  ・・・・・

補足:'PATH' に登録されている「MinGW」---
  <紙>は、複数の「MinGW」を使っているが、
  'PATH' に登録しているのは、その内の1つダケ。


それで、
今後は「Relo2」の代わりに、「Clang」を使おうと考えた。
----- この言い方は、正確では無いが、・・・・・

<紙>は、C言語ソース・コードは、「Relo2」内ではなくて、
単にテキストエディタで作っている。
コンパイル&リンクをワンクリックで行いたい為に「Relo2」を使っている。
なので、「ドラッグ&ドロップ」で代替しようと考えた。
----- と云うのが正しい。


手順は、上記の通りだが、
1.テキストエディタでソース・コードを作り、
2.Clang(MinGW)を呼び出すPythonファイルにドラッグ&ドロップする。
これだけ。

その例は、・・・・・・・・・・・・・・・・・・・・

========== test_prog.c:サンプルC言語ソース・コード

int Add( x, y ){ return x+y; }

#include
int main(){ printf( "2+3=%d\n", Add( 2, 3 ) ); }



======== DnD_c2exe.py:ドラッグ&ドロップでコンパイル&リンク

import os, sys
import subprocess

if len( sys.argv ) != 2: # Error ?
sys.exit(1)
else:
IN_C = os.path.basename( sys.argv[1] )
IN_D = os.path.dirname( sys.argv[1] )
os.chdir( IN_D )

OT_exe = IN_C.replace( '.c', '.exe' )
subprocess.call( 'clang -o %s %s' % ( OT_exe, IN_C ) )


これで、「test_prog.exe」が出来るので、
実行すると、・・・
“2+3=5”
と出る!



序でに、「.dll」の作成と、Python(+ctypes) での利用。

手順は、上記「.exe」の場合と変わらない。

======== test_func.c:サンプルC言語での関数定義コード

int Add( x, y ){ return x+y; }



======== DnD_c2dll.py:ドラッグ&ドロップで「.dll」作成

import os, sys
import subprocess

if len( sys.argv ) != 2: # Error ?
sys.exit(1)
else:
IN_C = os.path.basename( sys.argv[1] )
IN_D = os.path.dirname( sys.argv[1] )
os.chdir( IN_D )

OT_dll = IN_C.replace( '.c', '.dll' )
subprocess.call( 'clang -shared -o %s %s' % ( OT_dll, IN_C ) )


これで、「test_func.dll」が出来る。

そこで、これを利用する“Python”スクリプトを用意。

======== test_main.py:「ctypes」で「.dll」利用

import ctypes
kami = ctypes.cdll.LoadLibrary( 'test_func.dll' ) # import dll
print '2+3=%d' % kami.Add( 2, 3 ) # exec func


これで、「test_main.py」を実行すると、・・・
“2+3=5”
と出る!

メデタシ、めでたし。


本日はここまで。


見ていただいた序でとは厚かましい限りですが、
お帰りに投票して頂けるとなお嬉しいです。 ⇒ blogram投票ボタン


141207

関連記事
スポンサーサイト

コメントの投稿

管理者にだけ表示を許可する

おきてがみ/blogram
blogram投票ボタン



おきてがみ

最新記事
カレンダー
05 | 2017/06 | 07
- - - - 1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 -
月別アーカイブ
カテゴリ
最新コメント
検索フォーム
リンク
プロフィール

<紙>

Author:<紙>
ようこそ。
「パソコンヲタクの雑記帳」
もろもろなことを綴っています。
パソコン ヲタクってねくら?
画像は kami でなく kani です。

カウンター(fc2、i2i) /Google Analytics


i2i(from 2010-08-24)
Total =
Today  =  
Yesterday=
アンチエイジング

Google Analytics
ブックマーク