目录
- 一 前置概念
- 二 静态库
- 2.1
- 2.2
- 2.3放入指定路径
- 2.4 第三方库的使用
- 四 动态库
- 3.1 环境变量
- 3.2 软链接方案
- 3.3 配置文件方案
一 前置概念
- 我们在VS2022下安装开发环境实际上就是安装编译器软件、安装要开发的语言配套的库和头文件。
- 我们使用编译器有语法的自动提醒功能,需要包含头文件才能用。本质:编译器或者编辑器,它会自动的将用户输入的内容,不断的在被包含的头文件中进行搜索,自动提醒功能是依赖头文件来的。
- 语法报错是编译器进行的自动语法检查。
- 静态库(.a),动态库(.so)
- 一般云服务器,默认只存在动态库,不存在静态库,静态库需要单独安装。
二 静态库
2.1
-
生成 .c 文件的二进制文件,然后和源文件链接。
zcf是一个用户,他只写了一个main.c想要使用加法但是不会写,我们可以直接把add.c传到zcf那里去,但是如果我们不想直接传源文件那么就可以使用如图所示的方法。 -
先把add.c变成二进制文件add.o,然后把add.o和add.h传到zcf中,再把main.c变成main.o将两个文件链接在一起(gcc -o)即可。
2.2
- 生成静态库
我们先用 .o 文件生成静态库,然后进行编译,失败的原因能看到是链接错误,未能找到库
因为我们自己写的库编译器是不认识的,所以需要我们在编译时说明库的路径和名字,
-L加库的路径,-l加库的名字(找库的时候库名字记得去掉前缀和后缀)。
2.3放入指定路径
先新建两个目录,Include装头文件,mylib装库文件。
sudo cp -rf Include/* /usr/include/
将头文件目录放入默认搜索路径
/usr/include/ 是头文件的默认搜索路径,Include后面要加 /*
sudo cp mylib/* /lib64
将库文件目录放入默认搜索路径
/lib64 是库文件的默认搜索路径
再告诉编译器库的名字,这样就可以运行了。
2.4 第三方库的使用
- 需要指定的头文件和库文件
- 如果没有默认安装到系统gcc、g++默认的搜索路径下,需要告知编译器:a.头文件在哪,b.库文件在哪c.库文件具体是谁。
- 将我们下载下来的库和头文件,拷贝到系统默认路径下——在Linux下安装库。(卸载就是在默认路径下删除)
- 如果我们安装的库是第三方的(除了语言、操作系统接口)库,我们要想正常使用,即使是已经全部安装到系统中,必须用 -l 指明具体库的名字。
- 安装库需要sudo命令,或者超级用户。
四 动态库
与静态库有所不同,动态库在形成 .o 文件时需要与位置无关码,即在gcc
后加 -fPIC。
动态库和静态库的打包方式不同
我们仍然新建两个文件夹,分别放头文件和库文件,然后编译发现报错。
- 为什么找不到呢?
虽然我们告诉了编译器库的位置但是没有告诉OS,运行的时候我们的.so没有在系统的默认路径下,所以OS依然找不到。
静态库为什么能找到? 静态库的链接原则:将用户使用的二进制代码直接拷贝到目标可执行程序中。
(动态库不会这样)
- 如何解决?
利用下面的方法可以让OS找到动态库。
3.1 环境变量
我们可以把动态库的路径添加到环境变量中,这样就能找到了。
但是这只是临时方案,重新登录就环境变量就变了。
3.2 软链接方案
我们也可以建立软链接,在 /lib64 内放一个软链接这样就可以找到库了。
3.3 配置文件方案
先在配置文件目录中创建一个文件。
打开刚才创建的文件,把动态库的路径粘贴进去。此时还是找不到
需要ldconfig刷新一下,这样就能使用了。