原文链接:添加链接描述
我们此处为了说明静态库和动态库的编译,会使用示例代码。创建 test.h, hello.cpp 和 world.cpp, 在两个源文件中分别实现两个函数( 此处都是示例代码,文件命名不规范,理解意思即可 )。
test.h (静态库头文件)
#ifndef TEST
#define TEST
void hello();
void world();
#endif
hello.cpp:
#include
#include “test.h”
using namespace std;
void hello()
{
cout << “this is hello” << endl;
}
world.cpp:
#include
#include “test.h”
using namespace std;
void world()
{
cout << “this is world” << endl;
}
静态库编译:
linux 下静态库的命名规则为 lib+库名+.a
1、首先将源文件夹编译成目标文件 ( hello.o, world.o )
g++ -c hello.cpp world.cpp
注意 -c 参数是必须带,生成目标代码(机器代码),如果不带该参数,则是编译链接,由于没有main 函数,编译时会报错。编译完成之后生成 hello.o 和 world.o
2、用ar 工具将目标文件打包成 .a 静态库 ( libtest.lib )
ar -crv libtest.lib hello.o world.o
动态库编译:
linux 下动态库的命名规则为 lib+库名+.so
1、生成目标文件(hello.o world.o),此时需要加编译器 选项 -fpic
g++ -fpic -c hello.cpp world.cpp
2、生成动态库,
g++ -share -o libtest.so hello.o world.o
也可以将上面两步合并为一步
g++ -fpic -share -o libtest.so hello.pp world.cpp
如果生成的动态库不在 /lib 或者 /usr/lib 目录下,则需要将动态库的路径添加到 /etc/ld.so.cache 文件中,只有这样程序在运行时才能找到动态库, 添加步骤如下:
1、编辑 /etc/ld.so.conf 文件,将动态库路径加入该文件
2、调用 ldconfig 命令,重建 /etc/ld.so.cache 文件。
更为专业的生成动态库方式如下:
g++ -shared -Wl, -soname, libtest.so.1 -o libtest.so.1.10 hello.o world.o
编译完成之后生成 libtest.so.1.10 库文件,这是库的 realname
此时还需要将库路径添加入 /etc/ld.so.conf 中,然后 ldconfig -v 命令更新配置文件
更新完之后,生成了 libtest.so.1 文件,是库的 soname (运行时的时候用 soname,只记录主版本号,检查主版本是否正确)
调用如下命令,生成 linkname (linkname 在编译链接阶段使用,方便 makefile)
ln -s libtest.so libtest.so.1.10
动态库和静态库的调用
动态库和静态库的调用方式相同, 以 main.cpp 中调用库函数说明:
g++ -o main.exe main.cpp -L . -ltest
其中 -L 选项指明库函数的位置
-ltest 为库名的缩写,只有完全按照linux 库命名规则命名的库才能采用缩写。全名为 libtest.a 或 libtest.so