(原)lua使用ffi呼叫c程式的函式

2021-09-08 15:06:14 字數 3740 閱讀 9606

參考**:

1. 新建calcmath.cpp,輸入:

1 #include 2 #include 3 #include 4

//using namespace std;56

7extern"c

"1213float isquare(float

val)

1417

18double isqrt(double

val)

1922

23void ivecadd(double* a, double* b, int

len)

2429 }

說明:包含三個函式:isquare計算平方,isqrt計算開方,ivecadd計算兩個陣列對應元素之和。

2. 在終端中輸入:

g++ -shared -fpic -o libcalcmath.so calcmath.cpp
此時當前資料夾內會生成libcalcmath.so。

說明:不能使用gcc,會提示如下錯誤:

undefined symbol: _znst8ios_base4initd1ev
截圖如下:

3. 新建呼叫該庫的lua檔案:calcmath.lua(名字隨便),並輸入:

b 該檔案名字如果為ffi.lua的話,可能不能在其他檔案內成功呼叫(應該是與系統檔案ffi.lua衝突):

也可能能呼叫成功(在另一台電腦上試了一下,如果用include則失敗,如果用dofile則成功。。。)。

160830更新:剛才又試了一下,即便該檔案名字為『ffi.lua』,無論是include還是dofile,都能成功:test.lua的前6行如下:

local ffi = require("

ffi")--

include 'ffi.lua' -- this line and the following 2 line are both ok

require

'paths

'paths.

dofile('

ffi.lua

')

如果不加第一句require就不行。估計程式能區分開哪個是系統的庫檔案,哪個是當前的檔案。。。先將就著這樣理解吧。

4. 新建測試程式test.lua,並輸入:

1

local ffi = require("

ffi")2

3--include 'calcmath.lua' -- this line and the following 2 line are both ok45

require

'paths

'6 paths.dofile('

calcmath.lua')

78local c =calcmath.c910

local squareval = c.isquare(5)11

print

(squareval)

12local sqrtval = c.isqrt(5)13

print

(sqrtval)

1415

local a = ffi.new('

double[2]

', )

16local b = ffi.new("

double[2]

", )

1718

local x = ffi.cast('

double&

',a)

19local y = ffi.cast('

double&

',a+1)20

21 c.ivecadd(a, b, ffi.sizeof(a)/8)22

print(tonumber(x), tonumber

(y))

23print(ffi.sizeof(a))

說明:a第一句local ffi = require("ffi")必須要,否則下面的ffi.new無法使用。

b 不確定是否需要釋放new出來的記憶體。。。(以後碰到了再說吧)。

5. 結果:

使用th test.lua結果如下:

無法使用lua test.lua,會提示如下的錯誤:

使用luajit test.lua,結果如下:

說明

如果isqrt中引數型別使用float的話,精度會有損失,結果為:

2.2360680103302

使用double後,結果為:

2.2360679774998

使用計算器的結果:

2.2360679774997896964091736687313

可見,使用double後,精度範圍內結果一致。

lua呼叫c程式

鑑於lua5.4版本取消了lual register之後,網上教程的混亂,這裡以5.4版本為例,用lual setfuncs來代替。如下 ifdef cplusplus extern c else include include include include endif include inclu...

Lua的使用入門之在C 程式中呼叫lua函式1

學習lua將近半個月了,以前也了解過,只是沒有實際運用的環境。現在將自己這半個月來的心得寫下來。首先,要想在c 程式中作用lua指令碼,必須包含相應的lua標頭檔案,extern c 因為lua是基於c的,所以要使變數和 函式按照c語言方式編譯和連線 在你的編譯環境中要包含lua的標頭檔案,我的是l...

lua呼叫c 的函式 使用tolua

1.定義c 類與函式 include class cppfunctions include cppfunctions.h include include 使用linux下獲取時間的函式 double cppfunctions getcurrenttime 2.繫結 我新建了乙個tolua.h和乙個t...