linux 下编译生成静态库和动态库

18 篇文章 0 订阅

原文链接:添加链接描述

我们此处为了说明静态库和动态库的编译,会使用示例代码。创建 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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值