SO檔案的編寫,編譯,使用方法

2021-07-17 03:55:10 字數 3723 閱讀 3932

linux下的.so檔案為共享庫,相當於windows下的dll檔案。在系統目錄/usr/lib/下,我們可以看到很多應用程式庫檔案(常用的動態鏈結庫和軟體包的配置檔案)。

我們首先編寫簡單的兩個函式,然後把它編譯成so檔案

int

max(int a,int b)

int add(int a,int b)

(1)編譯時gcc後加-fpic,這可以使gcc產生於位置無關的**;

(2)連線時,使用-shared,指示生成乙個共享庫檔案;

(3)共享庫檔案一lib開頭+副檔名.so;

makefile檔案如下:

.suffixes:

.c.o

cc=gcc

srcs=test.c

objs=$(srcs:.c=.o)

exec=libtest.so

all:$(objs)

$(cc) -shared -o $(exec) $(objs)

.c.o:

$(cc) -wall -g -fpic -o $(@) -c $<

clean:

rm -f $(objs)

rm -f core*

xin@xin-lenovo-v3000

:~/code/test1

$ ls

makefile test.c test.h

xin@xin-lenovo-v3000

:~/code/test1

$ make

gcc -wall -g -fpic -o test.o -c test.c

gcc -shared -o libtest.so test.o

xin@xin-lenovo-v3000

:~/code/test1

$ ls

libtest.so makefile test.c test.h test.o

生成libtest.so檔案。

(1).bash_profile新增export ld_library_path=ld

libr

aryp

ath:

.或者將

.so文

件放入系

統目錄/

usr/

lib/

(不推薦

,這樣很

可能誤刪

,搞混系

統庫檔案

),之所

以新增e

xpor

tldl

ibra

rypa

th= ld_library_path:.是為了,呼叫.so檔案時候於.so檔案位置無關。

# .bash_profile

# get the aliases and functions

if [ -f ~/.bashrc ]; then

. ~/.bashrc

fi# user specific environment and startup programs

path=$path:$home/bin:.

export path

export ld_library_path=$ld_library_path:.

一定注意拼寫,寶寶曾經犯過一些關於拼寫錯誤,找了很長時間。

然後:wq退出,還要讓.bash_profile生效,輸入語句:

xin@xin-lenovo-v3000

:~$ . .bash_profile

注意:兩個小點之間有乙個空格。

(2)在別的c檔案(或者cpp)中使用so檔案,一定要包含so檔案的標頭檔案。

test.h檔案:

#ifndef test_h

#define test_h

#ifdef __cplusplus

extern "c"

#endif

#endif // test_h

這裡採用了混合程式設計,否則g++編譯會發生錯誤。

(3).cpp檔案為:

#include

#include

#include "test.h"

int main()

(4).cpp的makefile檔案編寫:

.suffixes:.cpp .o

cc=g++

srcs=a.cpp

objs=$(srcs:.cpp=.o)

exec=a

start:$(objs)

$(cc) -o $(exec) $(objs) -l. -ltest

.cpp.o:

$(cc) -wall -g -o $(

@) -c $<

clean:

rm -f $(objs)

rm -f core*

(cc

)−o (exec) $(objs) -l. -ltest

-l:在當前路徑尋找so檔案;

-ltest:意思為鏈結libtest.so這個庫檔案;

(5)make結果:

xin@xin-lenovo-v3000

:~$ cd code/test1

xin@xin-lenovo-v3000

:~/code/test1

$ make

g++ -wall -g -o a.o -c a.cpp

g++ -o a a.o -l. -ltest

xin@xin-lenovo-v3000

:~/code/test1

$ ls

a a.cpp a.o libtest.so makefile test.c test.h test.o

xin@xin-lenovo-v3000

:~/code/test1

$ ./a

max=5

add=9

如果我們.h檔案不採用混合編譯,而簡單的這樣寫:

#ifndef test_h

#define test_h

int max(int a,int b);

int add(int a,int b);

#endif // test_h

當我們make時候就會:

xin@xin-lenovo-v3000:~/code/test1$ make

g++ -wall -g -o a.o -c a.cpp

g++ -o a

a.o -l. -ltest

a.o:在函式『main』中:

/home/xin/code/test1/a.cpp:5:對『max(int, int)』未定義的引用

/home/xin/code/test1/a.cpp:6:對『add(int, int)』未定義的引用

collect2: error: ld returned 1 exit status

makefile:7: recipe for target 'start' failed

make: *** [start] error 1

因為我們編寫的.so檔案是c編寫的,如果cpp檔案呼叫,必須用extern 「c」關鍵字修飾,表示用c的方法識別這個函式。

使用NDK make編譯so檔案

首先開啟ndk的官網 選擇不受支援的舊版本。將ndk的編譯路徑d android ndk rxx prebuilt windows x86 64 bin e androidcrack platform tools 放到系統變數環境的path裡面 英文的。開啟cmd 輸入make 若出現下面這樣則配置...

g 編譯使用方法

用g 編譯單個原始檔myprog.cc很簡單,只要把檔名當引數傳給g 就行了。g myprog.cc ls l rwxr xr x 1 wvh users 13644 oct 5 16 17 a.out rw r r 1 wvh users 220 oct 5 16 17 myprog.cc 預設情...

使用mysql編寫儲存過程的使用方法

1.建立儲存過程 建立無參儲存過程。create procedure p cp begin select from user end 呼叫無參儲存過程 call p cp 在mybatis中呼叫儲存過程 建立有參 create procedure p cp in p unitid varchar 2...