在linux下, 创建共享库lib*.so的 方法简介



一. 编写测试文件(这里我写一个add测试程序)
1. 创建一个测试文件
liguowang@liguowang-desktop:~/vbox/shlib_test$ vim math.cpp 


int add(int x, int y)
{
    return x + y;
}
2. 编译这个math.cpp这个文件, 执行命令
liguowang@liguowang-desktop:~/vbox/shlib_test$ g++ -g3 -fPIC -shared math.cpp -o libmath.so


选项说明: 
-g3 
包含更多调试的信息,如程序中出现的所有宏定义.当使用`-g3'选项的时候,某些调试器支持宏扩展. 


-fpic 
如果支持这种目标机,编译器就生成位置无关目标码.适用于共享库(shared library). 


-fPIC 
如果支持这种目标机,编译器就输出位置无关目标码.适用于动态连接(dynamic linking),即使分支需要大范围 转移. 

-shared 
生成一个共享目标文件,他可以和其他目标文件连接产生可执行文件.只有部分系统支持该选项.


-o file 
指定输出文件为file.该选项不在乎GCC 产生什么输出,无论是可执行文件,目标文件,汇编文件还是预处理后的C 代码. 
    由于只能指定一个输出文件,因此编译多个输入文件时,使用`-o'选项没有意义,除非输出一个可执行文件. 
如果没有使用`-o'选项,默认的输出结果是:可执行文件为`a.out', `source.suffix  '的目标文 
件是`source.o',汇编文件是 `source.s',而预处理后的C 源代码送往标准输出. 
二. 调用此测试函数
1. 编写文件名为main.cpp的测试函数调用共享库
liguowang@liguowang-desktop:~/vbox/shlib_test$ vim main.cpp 




#include <stdio.h>


int add(int x, int y); 


int main(int argc, char *argv[])
{
    int x = 10, y = 18; 


    int sum = add(x, y); 


    printf("%d + %d = %d \n", x, y, sum);
    
    return 0;
}




2. 编译 main.cpp
liguowang@liguowang-desktop:~/vbox/shlib_test$ g++ -g3 main.cpp -o main -lmath -L/home/liguowang/vbox/shlib_test
( 如果在当前目录下就可以这样: g++ -g3 main.cpp -o main -lmath -L$PWD )
选项说明: 
-llibrary 
    连接名为library 的库文件. 

    连接器在标准搜索目录中寻找这个库文件,库文件的真正名字是`liblibrary.a'.连接器会 当做文 
    件名得到准确说明一样引用这个文件. 
    搜索目录除了一些系统标准目录外,还包括用户以`-L'选项指定的路径. 
    一般说来用这个方法找到的文件是库文件---即由目标文件组成的归档文件(archive file).连接 
    器处理归档文件的 方法是:扫描归档文件,寻找某些成员,这些成员的符号目前已被引用,不过还没 
    有被定义.但是,如果连接器找到普通的 目标文件,而不是库文件,就把这个目标文件按平常方式连 
    接进来.指定`-l'选项和指定文件名的唯一区别是, `-l 选项用`lib'和`.a'把library 包裹起来,而
    且搜索一些目录. 

-Ldir
在'-l'选项的搜索路径列表中添加dir目录


三. 执行程序main, 如下
liguowang@liguowang-desktop:~/vbox/shlib_test$ ./main
./main: error while loading shared libraries: libmath.so: cannot open shared object file: No such file or directory


为什么会出现错误, 不是上面编译生成main时已经添加了路径吗? 
答: 因为上面编译添加的选项(-lmath -L/home/liguowang/vbox/shlib_test), 只是链接过程中的链接选项, 而程序运行时需要添加环境变量
export LD_LIBRARY_PATH=/home/liguowang/vbox/shlib_test:$LD_LIBRARY_PATH 




在当前目录下也可如下: 
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$PWD





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值