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...