测试类的准备
先新建几个类来测试静态库和动态库的生成和使用
lib_a.h
#ifndef LIB_A_H
#define LIB_A_H
#include <iostream>
using namespace std;
void myPrint(); // 自定义函数的声明
#endif
lib_a.cpp
#include "lib_a.h"
void myPrint() {
cout <<"大家好,我叫张三"<<endl;
//cout <<"我爱北京天安门"<<endl;
//cout <<"保护环境人人有责"<<endl;
}
lib_a_test.cpp
#include "lib_a.h"
int main() {
myPrint();
}
image.png
静态库
静态库在编译的时候,主程序会把静态库编译进去,这样做的优点是,编译完成后,生成的可执行文件可以脱离静态库独立运行, 缺点是,静态库的文件每次改动,都要重新编译主程序
静态库文件名的命名方式是“libxxx.a”,库名前加”lib”,后缀用”.a”,“xxx”为静态库名
静态库的制作
g++ -c -o libtest.a lib_a.cpp
image.png
使用静态库
- 直接使用
g++ -o myPrint lib_a_test.cpp libtest.a
image.png
- 使用L参数指定静态库文件的目录,-l参数指定静态库名
g++ -o myPrint lib_a_test.cpp -L/home/lh/code/lib_a -ltest
image.png
注意:
- 如果要指定多个静态库文件的目录,用法是“-L/目录1 -L目录2 -L目录3”
- 链接库的文件名是libpublic.a,但链接库名是”public”,不是“libpublic.a”
- 如果要指定多个静态库,用法是“-l库名1 -l库名2 -l库名3”。
动态库
动态库在编译时并不会被连接到目标代码中,而是在程序运行时才被载入,因此在程序运行时还需要指定动态库的目录。
动态库的命名方式与静态库类似,前缀相同,为“lib”,后缀变为“.so” “xxx”为动态库名。
生成动态库
g++ -fPIC -shared -o libtest.so lib_a.cpp
使用动态库
g++ -o myPrint lib_a_test.cpp -L/home/lh/code/lib_a -ltest
image.png
报错:./myPrint: error while loading shared libraries: libtest.so: cannot open shared object file: No such file or directory
这是因为采用了动态链接库的可执行程序在运行时需要指定动态库文件的目录,Linux系统中采用LD_LIBRARY_PATH环境变量指定动态库文件的目录
export LD_LIBRARY_PATH=/home/lh/code/lib_a
image.png
网友评论