如何利用C生成 so供Mono呼叫

2021-04-28 09:28:13 字數 1136 閱讀 3002

mono誕生的初衷是為了吸引更多的windows .net程式設計師來加入linux平台的開發。但在linux世界中c語言依然是主流。很多時候一些關鍵應用(比如大型笛卡兒乘積運算、需要呼叫平台硬體功能的時候)不得不依賴c來完成。

這個時候 mono 多少顯得有些力不從心。

當然可以使用dllimport特性來完成對本地庫(.so)的呼叫。現在來講講如何生成自己的本地庫,並在mono中呼叫首先,先用 c 寫乙個簡單的函式,這個函式只用來把2個整形的形參相加之後返回結果。

//the file name is sum.c

#include 

int sum(int a, int b)

ok.現在我們準備生成乙個名為 libsum.so 的目標本地庫。使用 gcc 編譯器來編譯生成我們要的結果

gcc -wall -fpic -o2 -c -o libsum.o sum.c //生成.o

gcc -shared -wl,-soname,libsum.so -o libsum.so libsum.o //這步才生成共享庫 .so 檔案

這個時候已經生成 libsum.so。然後可以在 mono 中使用它了。 

using system;

using system.runtime.interopservices;

public class unsafedemo

", x);}}

之後可以編譯我們的程式:

$ mcs --unsafe unsafedemo.cs

$ mono unsafedemo.exe

如果在編譯程式的時候提示沒找到 libsum.so ,你可以把 libsum.so 放到與 unsafedemo.exe 同級的目錄下面試試。

最後提醒一點寫 c 的時候記住一點。c 是用返回值來判斷是否發生錯誤。而 mono 是用異常。

//c code segment

int debug (char *s)

//mono code segment

[dllimport ("libsum.so", entrypoint="debug")]

static extern int debug(string sb);

unsafe static void main()

else

}

c 生成so呼叫LOGI

前一陣為android程式寫了一些c 生成的so檔案,但是單檔案沒法單步除錯,導致呼叫時出現問題後不好定位 於是想到在c 程式的關鍵點打logi標記,剛開始遇到些問題,後來終於解決了,現在把解決方法記錄下來,方便自己,也方便別人。首先,在c 或c的開始定義巨集,如下 定義info資訊 define ...

c編譯生成so 庫

首先 gcc c fpic libst.c 生成 libst.o 然後gcc shared fpic o libst.so libst.o 生成 libst.so 動態鏈結庫 注意 fpic選項。pic指position independent code。共享庫要求有此選項,以便實現動態連線 dyn...

C語言生成DLL供C 呼叫

編寫c程式如下 include stdio.h declspec dllexport void myfun 儲存,取名為my.c 執行 vs 命令提示,cl c 路徑 my.c 執行以後會生成 my.obj,預設在vs安裝資料夾的vc目錄下 再執行 link dll 路徑 my.obj 在同乙個目錄...