0%

静态库和动态库的生成和使用

起因

我本人是不喜欢用这些什么库的,代码就是要开源才能大家一起进步,但是,这些终究只是极客幻想。现在还是打工仔呢,等日后有机会开工作室、独立研发或者商单的时候,在考虑这种事情吧。那么公司的代码,肯定就是要保密啦。保密的办法就是转为库

a静态库

静态库windows是.lib linux是.a文件,这两种静态库的二进制格式不一样,所以不能相互使用。

a静态库生成
1
2
3
gcc –o mylib.o –c mylib.c
ar rcs libmylib.a mylib.o
#此时生成了libmylib.a
a静态库使用

这个就非常简单了,就是把头文件添加到项目中,然后添加库文件到项目中,然后#include “mylib.h”即可。然后根据头文件中的数据和函数进行调用即可

so动态库

linux和UNIX的动态库一般是.so,这个好处就是,不用编进代码之中,缺点就是想要终端或者平台提前准备好动态库文件哦。#动态库库生成 #可以考虑写成makefile文件或者shell文件
windows的动态库一般是dll。

so动态库生成
1
2
3
4
gcc –fPIC -o mylib.o -c mylib.c		 	#(生成符号表)
gcc –shared -o libmylibs.so mylib.o #(防止重复加载)
#或者
gcc –fPIC –shared –o libmylibs.so mylib.c (可以省略 -c 和 .o后缀文件名)
so动态库使用
1
2
#方法一
gcc –o test test.c -lmylibs #后面就是接上动态库所在文件夹即可
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#方法二
#使用系统函数来使用动态链接库
#include <stdioh>
#include <dlfcn.h>
int main (void)
{
void *handle;
char *error;
void (*testFunction)(); //要变成指针函数来用(由符号表引出的指针)
if ((handle = dlopen(“/usr/lib/libmylibs.so”, RTLD_LAZY) == NULL)
{
printf (“dlopen error\n”);
exit(1);
}
testFunction = dlsym(handle, "testFunction");
if ((error = dlerror()) != NULL)
{
printf (“dlsym error \n”);
exit(1);
}
testFunction ();
dlclose (handle);
exit(0);
}
lib静态库
1
2
3
4
5
6
7
8
9
#方法一 打开cmd
gcc -c test.c
ar -cr libadd.a add.o
#编译
gcc main.c libadd.a -o test.exe
#或者
gcc main.c -ladd -L./ -o test.exe
#进行测试
test.exe

#方法二 打开keil 直接勾选output中的生成lib文件,生成库的时候不要把main和h文件添加进来,main是最好不要,因为可能冲突。h文件可有可无。然后点击编译即可。
使用方法和.a文件是一样的

dll动态库

我们一般使用vs或者devC++那些ide就可以生成了,虽然使用gcc命令行也可以实现编译,但是毕竟别人ide做了适配啥的,还是一键搞定方便。用vs举例子,点击生成新的动态库项目,然后在解决方案中的源文件和头文件目录中,添加需要的代码。然后选择X64模式,release版本,编译就可以了。然后就生成了dll文件lib文件,把这两个+代码头文件复制到新的项目所在的目录中。新的项目可以使用vs的控制台模式项目,然后在解决方案的资源文件中添加lib文件,不是dll文件哦,再把头文件添加到头文件目录中。然后声明头文件,调用即可。

cpp文件编写

1
2
3
4
5
6
7
8
#include "pch.h"    //必要的头文件
#include "myDll1.h" //自己的头文件

//一个简单的函数
int funTest(int a, int b)
{
//....
}

h文件编写

1
2
3
4
5
6
7
8
#pragma once  //规定只编译一次

//宏定义,增加可读性
#define DATAEXCHANGEDLL_API __declspec(dllexport)

//按C进行编译,声明.cpp中的函数
extern "C" DATAEXCHANGEDLL_API int funTest(int a, int b);
//为了兼容c,如果全是cpp文件的话,那么就无所谓了

对了vs还可以选择静态库项目,也是生成lib文件,使用的话,就是在解决方案的资源文件
中添加lib文件就可以了。自然也是可以gcc生成了,谁没事找事呢(doge)

结语

有些公司会选择visual GDB来进行开发stm32,这个时候就是linux的静态库,自然keil才是开发stm32的主流,所以还是使用的.lib文件,自然两者都会终究是好的

-------------下次的来访是什么时候呢[doge]-------------