linux 动态链接库的创建和使用--动态连接

原创 2012年03月25日 17:01:57
/*
 * author: hjjdebug
 * date: 2012
 * title: linux 动态链接库的创建和使用--动态连接
*/

动态连接,链接程序(gcc等)链接时无需指定第三方动态连接库,而是由调用者显式调用指定库,并获取对应库的函数入口地址

linux 动态链接库的创建和使用
1. 先创建一个动态链接库。源码如下:
$ cat max.cpp
extern "C"
{
    int max(int a, int b)
    {
        return a>b? a:b;
    }
}
加上extern "C", 是为了导出函数名称不用C++格式,而用C格式
编译生成动态库
g++ -shared -o libmax.so max.cpp

把库copy 到系统目录。

sudo cp libmax.so /lib

具体copy 到哪里可以用strace 跟踪一下, 它会按一定次序搜索目录加载。


2. 再创建一个测试用例,源码如下:
gitserver@gitserver-desktop:~/share/android4.0.3/hjj/pc$ cat test_d.cpp
#include <stdio.h>
#include <stdlib.h>
#include <dlfcn.h>    // 动态加载的函数头文件
// int max(int a, int b);
typedef int (*maxptr)(int a, int b);
int main(int argc, char *argv[])
{
        maxptr max;        // 定义max 型函数指针
        void *handle = dlopen("libmax.so",RTLD_LAZY);
        if(!handle)
        {
                printf("error open librayry libmax.so");
                exit(1);
        }
        max = (maxptr)dlsym(handle,"max");
        if(!max)
        {
                char *err=dlerror();
                printf("%s",err);
                exit(2);
        }
        int a=max(3,5);
        printf("the bigger is %d\n",a);
        dlclose(handle);
        return 0;
}

编译生成可执行文件
g++ -o test test.cpp -ldl

libdl.so 是必需的动态库

3. 运行可执行文件。
$ ./test
the bigger is 5

注意:
当没有用extern "C" 包含代码时, 运行会出现下列错误。
/lib/libmax.so: undefined symbol: max
你可以用nm 来查看libmax.so, 看其输出符号到底是什么,一看,知道应该用C 名称导出。
其它常见错误为:
1.没有包含dlfcn.h 头文件, 引起编译错误
test_d.cpp: In function ‘int main(int, char**)’:
test_d.cpp:9:36: error: ‘RTLD_LAZY’ was not declared in this scope
test_d.cpp:9:45: error: ‘dlopen’ was not declared in this scope
test_d.cpp:15:34: error: ‘dlsym’ was not declared in this scope
test_d.cpp:18:21: error: ‘dlerror’ was not declared in this scope
test_d.cpp:24:16: error: ‘dlclose’ was not declared in this scope

2.连接没有包含libdl.so, 出现连接错误
$ g++ -o test_d test_d.cpp  
/tmp/ccv8xKSN.o: In function `main':
test_d.cpp:(.text+0x19): undefined reference to `dlopen'
test_d.cpp:(.text+0x50): undefined reference to `dlsym'
test_d.cpp:(.text+0x60): undefined reference to `dlerror'
test_d.cpp:(.text+0xbd): undefined reference to `dlclose'
collect2: ld returned 1 exit status

3. 生成动态库没有采用-share 选项,出现连接错误
$ g++ -o libmax.so max.cpp
/usr/lib/gcc/i686-linux-gnu/4.6.1/../../../i386-linux-gnu/crt1.o: In function `_start':
(.text+0x18): undefined reference to `main'
collect2: ld returned 1 exit status

4. 当动态库中调用printf 等调用时,编译需要加上 -fPIC 选项(生成位置无关代码)否则出错

/usr/bin/ld: /tmp/ccVnb7rP.o: relocation R_X86_64_32 against `.rodata' can not be used when making a shared object; recompile with -fPIC
/tmp/ccVnb7rP.o: could not read symbols: Bad value

所以完整的编译选项是:

g++ -shared -fPIC -o libmax.so max.cpp


调试动态库与调试普通代码没有差别, 当然,要加上-g 选项才能跟踪代码调试。



版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

linux 下动态链接库的制作与使用

linux 下动态链接库的制作与使用 动态链接库*.so的编译与使用- - 动态库*.so在linux下用c和c++编程时经常会碰到,最近在网站找了几篇文章介绍动态库的编译和链接,总算搞懂了这个之...

Linux下c++调用自己编写的matlab函数:通过mcc动态链接库.so实现

之前在这里和这里调用了matlab自带的一些函数,是通过matlab引擎来实现的。那里调用的是matlab自带的函数,那么如果想调用自己写的.m函数该怎么办呢?其实很简单,原理类似,方法也不止一种。这...

Linux下动态链接库的创建和使用及C调用matlab动态库问题

其实这个资料网络上已经很多了,但是还是有一些细节让我捣鼓了很久,以及最近在做matlab mcc做成so文件供给c++调用的时候的一些问题。 首先如何制作Linux下的so 文件 【1】http://...
  • ylf13
  • ylf13
  • 2014-02-27 22:47
  • 2576

linux下c调用matlab总结

环境:ubuntu13.10(32bits) + matlabR2012a  1、背景知识 点击打开链接 2、配置环境  1) 终端中安装csh:  $ apt-get install csh  ...

C语言调用MATLAB生成的动态链接库的具体方法

本文具体讲述了一种C语言调用MATLAB生成的动态链接库的方法。

ubuntu c/c++中调用matlab函数

最近实验室一位伊拉克博士仁兄在写paper,要做仿真。需要在c++中调用matlab里面的函数。据说matlab已经有了动态链接库供调用,但是从网上百度google了下,暂时也没有找到比较详细的教程,...

linux下添加动态链接库路径的方法

Linux共享库路径配置   Linux下找不到共享库文件的典型现象为明明已经安装某个软包(如libnet,mysql),编译连接可以正常进行,但是在运行时出现如“error while loa...

linux三种方式使用库:静态链接库,动态链接库,动态加载库

+++原理+++ linux调用库的方式有三种: 1、静态链接库 2、动态链接库 3、动态加载库 动态链接库(共享库)和动态加载库文件没有任何区别,唯一区别是:动态链接库是程序运行一开始就要加载库,动...

Linux系统中动态库的链接和链接选项

动态库的链接和链接选项-L,-rpath-link,-rpath   链接动态库 如何程序在连接时使用了共享库,就必须在运行的时候能够找到共享库的位置。linux的可执行程序在执行的时候默认是先...

linux中共享库(动态链接库)的延迟载入

延迟载入的概念:不在一开始就将动态库中的函数/变量载入内存,而是在实际需要使用的时候才查找载入。延迟载入的主要作用是为了提高程序的启动速度。 本文承接上一篇博文《在linux中使用cmake构建共享库...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)