Windows系統(tǒng)vs環(huán)境下:
1、靜態(tài)庫:
1)生成:
a)在vs中將程序編寫完成
b)依次點擊 視圖->其他窗口->屬性管理器,在彈出的屬性管理器窗口中右鍵“Debug | Win32”條目 -> 屬性,在xxx屬性頁 左側(cè) 依次點擊 通用屬性 -> 常規(guī)
c)在右側(cè)找到“項目默認值”中的第一個“配置類型”,選擇“靜態(tài)庫(.lib)”
d)依次點擊 生成 -> 生成解決方案(ctrl+shift+b)
e)然后在 對應項目文件中的debug文件夾中即可找到xxx.lib文件
d)最后一定要編寫相應的.h文件
2)使用:(假設項目A需要使用)
a)將上訴e步驟中的xxx.lib和xxx.h文件復制到A項目文件下(和項目A的.c文件在一起)
b)在A項目中的“解決方案資源管理器”(左側(cè)欄)右鍵點擊頭文件 -> 添加 -> 現(xiàn)有項,選擇剛剛的xxx.h文件
c)依次點擊 依次點擊 視圖->其他窗口->屬性管理器,在彈出的屬性管理器窗口中右鍵“Debug | Win32”條目 -> 屬性,,在xxx屬性頁 左側(cè) 依次點擊 配置屬性 -> 鏈接器 -> 輸入,在左側(cè)窗口的第一項“附加依賴項”中添加剛剛的xxx.lib文件
d)在A項目的.c文件中#include “xxx.h”即可使用xxx.h中的函數(shù)了
2、動態(tài)庫:
1)生成
a)依次點擊 文件 -> 新建 -> 項目
b)點擊左側(cè) 模板 -> visual c++ -> Win32,在右側(cè)選擇win32控制臺應用程序(記得命名)點擊確定,在彈出的對話框中依次點擊 下一步 -> 在應用程序類型 選擇 DLL -> 完成
c)在右側(cè)依次點擊 右鍵源文件 -> 添加 -> 新建項 -> c++文件(一定要是c++文件)(eg:文件名為main.cpp)
d)在main.cpp文件中首先添加#include “stdafx.h”若要生成的dll是由C語言寫的話就如下操作:
main.cpp文件:
#include "stdafx.h"
extern "C"http://在c++語言中,extern "C"告訴編譯器,用C語言的方式編譯這個函數(shù)
{
__declspec(dllexport)//必須添加這句,告訴編譯器這個dll的函數(shù)入口,而且每一個函數(shù)都要加
int mymax(int a, int b)
{
if (a > b)
return a;
else
return b;
}
__declspec(dllexport)//同上
int myadd(int a, int b)
{
return a + b;
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
并且編輯相應的.h文件將其中的函數(shù)聲明包含進去,如果dll是由c++編寫的則參考另外一篇博客
e)依次點擊 生成 -> 生成解決方案(ctrl+shift+b)
f)然后在 對應項目文件中的debug文件夾中即可找到xxx.lib和相應的xxx.dll文件
2)使用:(假設項目A需要使用)
a)將上訴f步驟中的xxx.lib和xxx.h文件復制到A項目文件下(和項目A的.c文件在一起),*并且一定要把上述的xxx.dll文件復制到A項目的第一個文件下的debug下(即:項目A -> debug若沒有這個文件夾則讓A項目編譯一次,會出錯沒關系)
b)在A項目中的“解決方案資源管理器”(左側(cè)欄)右鍵點擊頭文件 -> 添加 -> 現(xiàn)有項,選擇剛剛的xxx.h文件
c)在A項目的c文件中添加#include “xxx.h”和#pragma comment(lib,”mydll.lib(對應的dll文件名)”)即可使用xxx.h中的函數(shù)了
Linux系統(tǒng)中:
1、靜態(tài)庫:
1)生成:
a)首先直接編寫要生成庫的函數(shù):(放在/home/book/LinuxProgmentTest/mycalc/src中)
add.c文件:int add(int a,int b){return a+b;}
sub.c文件:int sub(int a,int b){return a-b;}
mul.c文件:int mul(int a,int b){return a*b;}
sub.c文件:int div(int a,int b){return a/b;}
b)編譯靜態(tài)庫可以有兩種方式:
I)在終端中進入src文件夾,依次輸入:
gcc -c -fPIC *.c
ar rcs libmycal.a *.o
II)或者編寫makefile如下:
CC=gcc
SRCS=add.c sub.c mul.c div.c
OBJS=$(SRCS:.c=.o)
libmycal.a:$(OBJS)
ar rcs libmycal.a $(OBJS)
%.o:%.c
$(CC) -o $@ -c $< -fPIC
clean:
rm -rf $(OBJS) *~
最后在mycalc文件夾下新建一個lib目錄,將生成的libmycal.a文件拷貝到lib目錄下。
c)編寫相關的頭文件(將編譯好的文件放到/home/book/LinuxProgmentTest/mycalc/include中)
commemd.h:
#ifndef COMMON_H_
#define COMMON_H_
int add(int a,int b);
int sub(int a,int b);
int div(int a,int b);
int mul(int a,int b);
#endif
d)使用nm命令可以查看其中包括的函數(shù)和在何處實現(xiàn)的(eg:nm libmycal.a)
2)使用:(以/home/book/LinuxProgmentTest/mycalc為例)
所有的文件編寫好后結(jié)構(gòu)如下:
a)編寫好main.c文件后,編譯的時候可以有兩種方式:
I)gcc -Iinclude main.c lib/libmycal.a -o app (因為頭文件在include文件夾中)
II)或者編寫makefile文件如下:
CC=gcc
SRCS=main.c
OBJS=$(SRCS:.c=.o)
LINK=include
LIB=lib/libmycal.a
main:$(OBJS)
$(CC) -o main $(OBJS) -I$(LINK) $(LIB)
%.o:%.c
$(CC) -o $@ -c $< -I$(LINK)
clean:
rm -rf $(OBJS) *~
**2、動態(tài)庫:
**1)生成:
a)首先直接編寫要生成庫的函數(shù)eg:
int max(int a,int b)
{
if(a>b)
return a;
else
return b;
}
(假設名字為mydll.c)
b)編譯動態(tài)庫可以有三種方式:
I)在mydll.c文件夾下依次輸入:
gcc -c mydll.c -fPIC -o mydll.o
gcc -shared -o libmydll.so mydll.o
II)或者編寫makefile如下:
CC=gcc
SRCS=mylib.c
OBJS=$(SRCS:.c=.o)
libmylib.so:$(OBJS)
$(CC) -o libmylib.so $(OBJS) -shared
%.o:%.c
$(CC) -o $@ -c $< -fPIC
clean:
rm -rf $(OBJS) *~
*III)在mydll.c文件夾下依次輸入:
gcc -c mydll.c -fPIC -o mydll.o
gcc -shared -W1,-soname,libmydll.so.1 -o libmydll.so.1.10 mydll.o
(就可以生成有版本so文件)
IIII)但是記住不論用哪一種方式都有這三條:
1、gcc編譯的時候(有-c參數(shù)時)要加-fPIC選項,-fPIC是告訴gcc生成一個與位置無關的代碼
2、gcc鏈接的時候要加-shared選項,意思是生成一個so共享庫
3、對于linux或者unix,一個so文件,文件擴展名必須是so,文件名的前三個字母必須是lib
c)編寫相關的頭文件,將上訴函數(shù)的聲明放入頭文件中eg:
#ifndef MYLIB_H
#define MYLIB_H
int max(int i,int j);
#endif
#**2)使用:(假設項目A需要使用)
a)把libxxx.so放在和A項目的.c文件目錄下,編譯項目A的時候可以有兩種方式:
I)方法一:
gcc -c main.c -o main.o
gcc -o main main.o -L. -lxxx
(-L.后面有一個小點,-lxxx小寫的L字母,xxx是libxxx.so中的xxx)
II)方法二:或者編寫makefile文件如下:
CC=gcc
SRCS=main.c
OBJS=$(SRCS:.c=.o)
main:$(OBJS)
$(CC) -o main $(OBJS) -L. -lxxx
%.o:%.c
$(CC) -o $@ -c $<
clean:
rm -rf $(OBJS) *~
b)修改環(huán)境變量:
ldd指令可以查看該可執(zhí)行程序的鏈接情況(eg:ldd main)
在命令行依次輸入:cd (后面有一個空格) -> sudo gedit .proflie -> 在最后一行的下一行添加這句話:export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:. 然后保存退出 -> 輸入. .profile(點 空格 點profile)
c)在項目A文件夾中輸入ldd main可以查看文件main的鏈接情況只有當括號中都有東西是才能執(zhí)行
d)然后就可以運行了
注1:
目錄結(jié)構(gòu):

更改環(huán)境變量前:

更改環(huán)境變量前如果運行則會出現(xiàn)錯誤:

更改環(huán)境變量后,即可找到動態(tài)庫位置:

|