Linux下创建静态、动态库

来源:互联网 发布:120dvd域名改成什么了 编辑:程序博客网 时间:2024/05/01 12:13

Linux下创建静态、动态库

源码

-----------a.cpp---------------
#include <cstdio>
int a(int i)
{
        std::printf("in a(int a) %d/n", i);
        return 0;
}

-----------b.cpp----------------
#include <iostream>
int b(char *s)
{
        std::cout<<"in int b(char *s): "<<s<<std::endl;
        return 0;
}
----------main.cpp--------------
#include <cstdio>
using namespace std;
int a(int i);
int b(char *s);
int main()
{
        a(5);
        b("ok");
        printf("in main/n");
        return 0;
}

静态库
1、编译生成a.o b.o 文件
# g++ -c a.cpp b.cpp

2、生成archive 文件libtest.a  c-创建  r-将文件加入libtest.a
#ar rc libtest.a a.o b.o

3、指定静态库libtest.a 进行编译
# g++ -o main main.cpp libtest.a

运行结果
# ./a.out
in a(int a) 5
in int b(char *s): ok
in main

对于libtest.a直接将里面的代码拷贝出来相当于静态编译

动态库
1、编译生成a.o b.o文件   -fPIC生成.o文件时用相对地址实现代码位置无关
# g++ -fPIC a.cpp b.cpp

2、生成动态库libtest.so
# g++ -shared -o libtest.so a.o b.o

3、指定动态库libtest.so进行编译
# g++ main.cpp  ./libtest.so

查看动态连接库
# ldd a.out
        ./libtest.so => ./libtest.so (0x40014000)
        libstdc++-libc6.2-2.so.3 => /usr/lib/libstdc++-libc6.2-2.so.3 (0x4002e000)
        libm.so.6 => /lib/i686/libm.so.6 (0x40071000)
        libc.so.6 => /lib/i686/libc.so.6 (0x42000000)
        /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)
        /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)

其他
1、动态连接库3时如果
# g++ main.cpp libtest.so
编译可通过但运行出错在默认库路径下找不到libtest.so库
# ./a.out
./a.out: error while loading shared libraries: libtest.so: cannot open shared object file: No such
file or directory
查看连接库
# ldd a.out
        libtest.so => not found
        libstdc++-libc6.2-2.so.3 => /usr/lib/libstdc++-libc6.2-2.so.3 (0x4002c000)
        libm.so.6 => /lib/i686/libm.so.6 (0x4006f000)
        libc.so.6 => /lib/i686/libc.so.6 (0x42000000)
        /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)

2、方便使用可以将静态库libtest.a或者动态库libtest.so拷贝到默认库的查找路径里/lib或者/usr/lib里,
编译时直接
#g++ main.cpp -ltest
-l 自动进行库名称扩展
# ldd a.out
        libtest.so => /usr/lib/libtest.so (0x4002b000)
        libstdc++-libc6.2-2.so.3 => /usr/lib/libstdc++-libc6.2-2.so.3 (0x4002e000)
        libm.so.6 => /lib/i686/libm.so.6 (0x40071000)
        libc.so.6 => /lib/i686/libc.so.6 (0x42000000)
        /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)
静态情况
# g++ main.cpp -ltest
# ldd a.out
        libstdc++-libc6.2-2.so.3 => /usr/lib/libstdc++-libc6.2-2.so.3 (0x4002b000)
        libm.so.6 => /lib/i686/libm.so.6 (0x4006f000)
        libc.so.6 => /lib/i686/libc.so.6 (0x42000000)
        /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)

3、静态库中2生成archive后可能需要ranlib libtest.a 将内容的索引写入libtest.a中供ld连接时使用

4、-l选项要放在所编译文件的后面,在前面会出错
# g++ -ltest main.cpp
/tmp/ccbQK3kY.o: In function `main':
/tmp/ccbQK3kY.o(.text+0xc): undefined reference to `a(int)'
/tmp/ccbQK3kY.o(.text+0x1c): undefined reference to `b(char *)'
collect2: ld returned 1 exit status

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 订机票时没有用常旅客卡怎么办 京东退货退款卖家已签收了怎么办 京东账号手机号换了密码忘了怎么办 qq飞车手游录像下载失败怎么办 手机知道qq号怎么破解密码怎么办 网上购物已付钱迟迟不发货怎么办 有人冒充微信头像和熟人借钱怎么办 微信红包输了50多万怎么办 脖子里的绳结接口磨脖子怎么办 母比格犬生了小狗毛色变了怎么办 母比格犬生了小狗毛色很差怎么办 貂皮大衣上的暗扣掉了怎么办 呢子夹克袖子长但又不想改短怎么办 黑色的衣服熨的有点发亮怎么办 宿管阿姨工作中与学生起冲突怎么办 中通快递发的衣服不合适怎么办 加盟母婴店如果不干了货怎么办 双十一搞活动买的东西退货怎么办 天猫预售30天不发货怎么办 天猫搞活动的商品总不发货怎么办 淘宝买的东西物流把货物损坏怎么办 苹果手机5s每部存满怎么办 天猫退货分开发货退的话怎么办 淘宝优惠券电脑端显示不出来怎么办 天猫退货退款寄错了怎么办 天猫已退款货又发过来了怎么办 小米商城预售订单点错退款了怎么办 淘宝发布宝贝类目价格受限制怎么办 2019天猫续签评分不达标怎么办 天猫店铺动态不达标不能续签怎么办 京东自提发现货有问题怎么办 京东试用成功商家不发货怎么办 在淘宝主页搜不到我的店铺名怎么办 淘宝发货单号填到别人那去了怎么办 买家申请淘宝介入后同意退款怎么办 淘宝卖家手机版购买装修模块怎么办 天猫店铺和淘宝店铺想要装修怎么办 支付宝转账银行卡卡号错误怎么办 淘宝图片空间照片全部删除了怎么办 我把淘宝图片空间照片删除了怎么办 淘宝发布宝贝怎么没知道品牌怎么办