Linux函数库通常分为两种类型:静态函数库和动态函数库。静态函数库是指函数库文件被编译进可执行文件中,而动态函数库则是指函数库文件在程序运行时被载入到内存中。下面是详细讲解和安装过程的完整攻略。
静态函数库
在Linux系统中,静态函数库使用的是.a
文件,也被称为归档文件。静态函数库的优点是在执行时速度很快,但是缺点是可执行文件的大小和内存占用可能会非常大。
创建静态函数库
创建静态函数库需要先编写自己的库文件,并将其编译为.a
文件。以下是一个示例C程序:
// sum.h
int sum(int n);
// sum.c
#include "sum.h"
int sum(int n) {
int s = 0;
for (int i = 1; i <= n; i++) {
s += i;
}
return s;
}
将上述代码保存为sum.c
和sum.h
文件。接着,使用以下命令编译生成.a
文件:
gcc -c sum.c # 生成sum.o文件
ar rcs libsum.a sum.o # 将sum.o文件打包为libsum.a文件
执行上述命令后,当前目录下会生成一个libsum.a
文件。这就是我们的静态函数库文件。
使用静态函数库
在使用静态函数库的时候,需要告诉编译器函数库在哪里。可以使用以下命令编译程序:
gcc main.c -L. -lsum -o main # 将libsum.a文件链接到可执行文件中
上述命令中,L
选项指定函数库的路径,l
选项指定函数库的名称。其中,-l
选项的参数是不需要lib
前缀,也不需要.a
后缀。
下面是一个示例程序:
// main.c
#include <stdio.h>
#include "sum.h"
int main() {
int s = sum(100);
printf("1+2+...+100 = %d\n", s);
return 0;
}
动态函数库
动态函数库使用的是.so
文件,也被称为共享库。动态函数库的优点是可执行文件的大小和内存占用更小,但是执行时速度可能会稍慢一些。
创建动态函数库
创建动态函数库的方法与静态函数库类似,只需要在编译时加上-fPIC
选项即可。以下是创建动态函数库的示例C程序:
// sum.h
int sum(int n);
// sum.c
#include "sum.h"
int sum(int n) {
int s = 0;
for (int i = 1; i <= n; i++) {
s += i;
}
return s;
}
编译生成.so
文件的命令如下:
gcc -fPIC -shared -o libsum.so sum.c
执行上述命令后,当前目录下会生成一个libsum.so
文件。这就是我们的动态函数库文件。
使用动态函数库
使用动态函数库的方法与静态函数库类似,只需要更改编译时的选项即可。以下是使用动态函数库的示例程序:
// main.c
#include <stdio.h>
#include <dlfcn.h>
#include "sum.h"
int main() {
void *handle;
int (*sum)(int);
char *error;
handle = dlopen("./libsum.so", RTLD_LAZY);
if (!handle) {
fprintf(stderr, "%s\n", dlerror());
return 1;
}
sum = dlsym(handle, "sum");
error = dlerror();
if (error) {
fprintf(stderr, "%s\n", error);
return 1;
}
int s = (*sum)(100);
printf("1+2+...+100 = %d\n", s);
dlclose(handle);
return 0;
}
在程序中,使用dlopen()
函数打开动态函数库,使用dlsym()
函数获取函数地址,并调用该函数。最后使用dlclose()
函数关闭动态函数库。
安装函数库
安装静态函数库和动态函数库的方法类似。需要将函数库文件拷贝到操作系统的指定目录下,并更新函数库缓存。
以Ubuntu系统为例,安装静态函数库的命令如下:
sudo cp libsum.a /usr/local/lib/
sudo ldconfig -n /usr/local/lib/
安装动态函数库的命令如下:
sudo cp libsum.so /usr/local/lib/
sudo ldconfig -n /usr/local/lib/
在使用函数库时,只需要在编译时加上-lfunction_name
选项即可。操作系统会自动在函数库路径中查找并链接函数库。
示例代码
以下是使用动态函数库的示例代码(以sum为例):
// sum.h
#ifndef SUM_H_
#define SUM_H_
#ifdef __cplusplus
extern "C" {
#endif
int sum(int n);
#ifdef __cplusplus
}
#endif
#endif // SUM_H_
// sum.c
#include "sum.h"
int sum(int n) {
int s = 0;
for (int i = 1; i <= n; i++) {
s += i;
}
return s;
}
// main.c
#include <stdio.h>
#include <dlfcn.h>
#include "sum.h"
int main() {
void *handle;
int (*sum)(int);
char *error;
handle = dlopen("./libsum.so", RTLD_LAZY);
if (!handle) {
fprintf(stderr, "%s\n", dlerror());
return 1;
}
sum = dlsym(handle, "sum");
error = dlerror();
if (error) {
fprintf(stderr, "%s\n", error);
return 1;
}
int s = (*sum)(100);
printf("1+2+...+100 = %d\n", s);
dlclose(handle);
return 0;
}
注意,需要使用extern "C"
将函数声明包含在C++中。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详解Linux函数库及其安装过程 - Python技术站