目录
一、用GCC生成动态库和静态库
(一)前言
动态链接库(Dynamic Link Library 或者 Dynamic-link Library,缩写为 DLL),是微软公司在微软Windows操作系统中,实现共享函数库概念的一种方式。这些库函数的扩展名是 ”.dll"、".ocx"(包含ActiveX控制的库)或者 ".drv"(旧式的系统驱动程序)。
Windows 中,DLL 多数情况下是带有 ".dll" 扩展名的文件,但也可能是 ".ocx"或其他扩展名;Linux系统中常常是 ".so" 的文件。它们向运行于 Windows操作系统下的程序提供代码、数据或函数。程序可根据 DLL 文件中的指令打开、启用、查询、禁用和关闭驱动程序。
静态库是指在我们的应用中,有一些公共代码是需要反复使用,就把这些代码编译为“库”文件;在链接步骤中,连接器将从库文件取得所需的代码,复制到生成的可执行文件中的这种库。
静态库和动态库是两种共享程序代码的方式,它们的区别是:静态库在程序的链接阶段被复制到了程序中,和程序运行的时候没有关系;动态库在链接阶段没有被复制到程序中,而是程序在运行时由系统动态加载到内存中供程序调用。使用动态库的优点是系统只需载入一次动态库,不同的程序可以得到内存中相同的动态库的副本,因此节省了很多内存。
(二)静态库的使用
首先在Linux虚拟机上创建一个文件夹用于存放本次的实验内容
编写代码:
hello.h
#ifndef HELLO_H
#define HELLO_H
void hello(const char *name);
#endif//HELLO_H
hello.c
#include<stdio.h>
void hello(const char *name)
{
printf("Hello %s\n",name);
}
main.c
#include"hello.h"
int main()
{
hello("everyone");
return 0;
}
创建好的效果如下
gcc编译得到.o文件
gcc -c hello.c
使用静态库
首先创建静态库,创建静态库的工具:ar。静态库文件命名规范:以lib作为前缀,是.a文件
ar -crv libmyhello.a hello.o
在程序中使用静态库
gcc -o hello main.c -L. -lmyhello
gcc main.c libmyhello.a -o hello
先生成main.o文件
gcc -c main.c
然后再生成可执行文件
gcc -o hello main.c libmyhello.a
效果如下
(三)动态库的使用
首先创建动态库
gcc -shared -fPIC -o libmyhello.so hello.o
在程序中执行动态库
gcc -o hello main.c -L. -lmyhello或gcc main.c libmyhello.so -o hello
在运行hello程序时,会出现如下错误
问题的解决方法:将libmyhello.so复制到目录/usr/lib中。
mv libmyhello.so /usr/lib
在复制时可能会出现权限不够问题
输入 sudo -s 输入密码获得root权限