windows和linux制作动态库,(四)静态库和动态库的生成和使用(windows(基于vs)和Linux(基于Ubuntu))...

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为例)

所有的文件编写好后结构如下:

111785584_1_20170924062237498

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:

目录结构:

111785584_2_20170924062237841

更改环境变量前:

111785584_3_20170924062238498

更改环境变量前如果运行则会出现错误:

111785584_4_20170924062238841

更改环境变量后,即可找到动态库位置:

111785584_5_2017092406223960

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值