Windows系统vs环境下:
1、静态库:
1)生成:
a)在vs中将程序编写完成
b)依次点击 视图->其他窗口->属性管理器,在弹出的属性管理器窗口中右键“Debug | Win32”条目 -> 属性,在xxx属性页 左侧 依次点击 通用属性 -> 常规
c)在右侧找到“项目默认值”中的第一个“配置类型”,选择“静态库(.lib)”
d)依次点击 生成 -> 生成解决方案(ctrl+shift+b)
e)然后在 对应项目文件中的debug文件夹中即可找到xxx.lib文件
d)最后一定要编写相应的.h文件
2)使用:(假设项目A需要使用)
a)将上诉e步骤中的xxx.lib和xxx.h文件复制到A项目文件下(和项目A的.c文件在一起)
b)在A项目中的“解决方案资源管理器”(左侧栏)右键点击头文件 -> 添加 -> 现有项,选择刚刚的xxx.h文件
c)依次点击 依次点击 视图->其他窗口->属性管理器,在弹出的属性管理器窗口中右键“Debug | Win32”条目 -> 属性,,在xxx属性页 左侧 依次点击 配置属性 -> 链接器 -> 输入,在左侧窗口的第一项“附加依赖项”中添加刚刚的xxx.lib文件
d)在A项目的.c文件中#include “xxx.h”即可使用xxx.h中的函数了
2、动态库:
1)生成
a)依次点击 文件 -> 新建 -> 项目
b)点击左侧 模板 -> visual c++ -> Win32,在右侧选择win32控制台应用程序(记得命名)点击确定,在弹出的对话框中依次点击 下一步 -> 在应用程序类型 选择 DLL -> 完成
c)在右侧依次点击 右键源文件 -> 添加 -> 新建项 -> c++文件(一定要是c++文件)(eg:文件名为main.cpp)
d)在main.cpp文件中首先添加#include “stdafx.h”若要生成的dll是由C语言写的话就如下操作:
main.cpp文件:
#include "stdafx.h"
extern "C"//在c++语言中,extern "C"告诉编译器,用C语言的方式编译这个函数
{
__declspec(dllexport)//必须添加这句,告诉编译器这个dll的函数入口,而且每一个函数都要加
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文件将其中的函数声明包含进去,如果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项目中的“解决方案资源管理器”(左侧栏)右键点击头文件 -> 添加 -> 现有项,选择刚刚的xxx.h文件
c)在A项目的c文件中添加#include “xxx.h”和#pragma comment(lib,”mydll.lib(对应的dll文件名)”)即可使用xxx.h中的函数了
Linux系统中:
1、静态库:
1)生成:
a)首先直接编写要生成库的函数:(放在/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)编译静态库可以有两种方式:
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) *~1
2
3
4
5
6
7
8
9
10
最后在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);
#endif1
2
3
4
5
6
7
d)使用nm命令可以查看其中包括的函数和在何处实现的(eg:nm libmycal.a)
2)使用:(以/home/book/LinuxProgmentTest/mycalc为例)
所有的文件编写好后结构如下:
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) *~1
2
3
4
5
6
7
8
9
10
11
12
**2、动态库:
**1)生成:
a)首先直接编写要生成库的函数eg:
int max(int a,int b)
{
if(a>b)
return a;
else
return b;
}1
2
3
4
5
6
7
(假设名字为mydll.c)
b)编译动态库可以有三种方式:
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) *~1
2
3
4
5
6
7
8
9
10
*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参数时)要加-fPIC选项,-fPIC是告诉gcc生成一个与位置无关的代码
2、gcc链接的时候要加-shared选项,意思是生成一个so共享库
3、对于linux或者unix,一个so文件,文件扩展名必须是so,文件名的前三个字母必须是lib
c)编写相关的头文件,将上诉函数的声明放入头文件中eg:
#ifndef MYLIB_H
#define MYLIB_H
int max(int i,int j);
#endif1
2
3
4
5
6
#**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) *~1
2
3
4
5
6
7
8
9
10
b)修改环境变量:
ldd指令可以查看该可执行程序的链接情况(eg:ldd main)
在命令行依次输入:cd (后面有一个空格) -> sudo gedit .proflie -> 在最后一行的下一行添加这句话:export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:. 然后保存退出 -> 输入. .profile(点 空格 点profile)
c)在项目A文件夹中输入ldd main可以查看文件main的链接情况只有当括号中都有东西是才能执行
d)然后就可以运行了
注1:
目录结构:
更改环境变量前:
更改环境变量前如果运行则会出现错误:
更改环境变量后,即可找到动态库位置: