tcc 学習:libtcc 直接使用(成功)

2017-05-19 :  PCクリニック
Python、C言語、Perl、グルコサミン、Firefox
前(2017-05-17)の記事「tcc 学習:libtcc 直接使用」では、

  libtcc1.a に関するエラー原因不明。

で終わっていた。


その後の学習で、原因が判明した。


一番大事なことは、

tcc への PATH を登録している場合、
カレントに、libtcc.dll を置いてはダメ。


と云うことでした。


カレントに置かなければ、libtcc1.a を見つける。
なので、libtcc1.a もカレントに置かなくて良い。
(置いても問題ないが、それはムダ)


そうすると、

  tcc_add_library_path( TCL, '.' )

の行もイラナイ。


つまり、
カレントには、(正しい?)use_libtcc_inline_C.gsl ダケで十分。


結局、以下のコードで十分:
----- use_libtcc_inline_C.gsl -----
-------- void* は、正確には TCCState*
ffi.cdef[[
void* tcc_new( void );
int tcc_set_output_type( void* s, int output_type );

int tcc_compile_string( void* s, const char* buf );
int tcc_relocate( void* s1, void* ptr );

void* tcc_get_symbol( void* s, const char* name );
void tcc_delete( void* s );
]]

-- =========================
tcc = ffi.load( 'libtcc' ) -- カレントに libtcc.dll は置かない
relocate_auto = ffi.cast( 'void*', 1 )

charA = |s| ffi.cast( 'char*', s )
-- =========================

TCL = tcc.tcc_new()
tcc.tcc_set_output_type( TCL, 0 ) -- 0 : run in memory

-- ===== Cコード =====
sss = [[ int Add( int x, int y ){
return x + y;
}
]]
tcc.tcc_compile_string( TCL, charA(sss) )

tcc.tcc_relocate( TCL, relocate_auto )

sym = tcc.tcc_get_symbol( TCL, charA('Add') )
Add = ffi.cast( 'int(*)( int, int )', sym )

-- ===== GSL Shell コード =====

z = Add( 2, 5 ); print( z )
print( Add( 10, 5 ) )

-- ===== 後処理 ============
tcc.tcc_delete(TCL)
_=io.read(1)
こんな感じ。

これでスッキリした。


本日はここまで。


luajit-tcc 学習は続く。


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


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

コメントの投稿

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

おきてがみ/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
ブックマーク