linux高编函数库,Linux里的函数库(Library)

在Linux里面,有2种基本的库的形式:

Static: 静态的库,一般称为archive,就是将多个object file合并成一个文件,然后在程序编译的时候静态链接,并且将使用的函数静态的写入最终的可执行程序里面。

Dynamic:动态库。

程序静态的调用,但是具体的调用过程是在动态加载的。

函数库完全动态的加载,在编译的时候完全不需要有函数的链接过程出现。适合用来进行plugin模式的开发。

这里主要是讲动态库的问题。

如何生成动态库:

当编辑好动态库的源代码之后,使用下面的命令进行编译。

gcc -Wall -fPIC -c *.c

gcc -shared -Wl,-soname,libctest.so.1 -o libctest.so.1.0 *.o其中第1步里面的-fPIC是对于生成动态库所必须的。关于这两条命令的具体参数的含义可以看[1]。

而在之后的程序编译时候,只要使用-l标志就可以让链接器找到动态库并作相关的工作。

而在程序运行的时候,需要让程序加载器找到对应的函数库。

可以通过下面3种方式来把新增加的函数库记录加载到系统中。

(永久)将动态函数库的目录名添加到 /etc/ld.so.conf里面去。然后用root权限执行ldconfig命令进行重新的加载。

(临时)使用ldconfig -n /path/to/the/dir 来临时加载指定的目录。这个方法在重启之后就会失效。

(临时)在LD_LIRBARY_PATH里面添加函数库的目录,这样就可以指定ld.so的加载库的搜索路径。

关于C++的Name mangle

所谓的name mangle,也就是C++在声称object file的时候,会把函数名变成一些不易利用的名字,而不是像C那样是完全照字面上的函数名那样存在object file里面。这个可以通过nm命令来查看。

如果对一个C的函数库使用nm来查看里面的的定义,比如我在代码里面定义了test()函数,那么在nm输出里面也可以看到test。

但是在C++的nm输出里面,则是没有test的,说明编译器将名字做了一些变换(mangle)。

如果想要在C程序里面直接调用C++里面定义的函数的话,那么会在链接的时候出现undefined reference的错误。所以需要在写C++的做一些工作。

我将这个过程写作C++  -> C

如果要将C++里面的函数暴露成C也可以调用的话,那么我们需要将函数的定义放在extern "C" directive里面,具体如下。

extern"C"

{

voidtest(int*i)

{

*i=5;

}

}

这样就可以将函数暴露给C了。

而如果要在C++里面调用C的函数的话,也是要做相应的一些操作的。我们需要在编译C++程序的时候,让编译器之后我们调用的函数是从C里面来的。

在C++里面将函数声明放在extern "C" directive后面就可以了。如下:

extern"C"directive

使用动态加载的方式加载函数库

需要使用dlfcn.h函数库。如下是一个使用的过程的例子:

#include 

#include 

#include 

#include "ctest.h"

intmain(intargc,char**argv)

{

void*lib_handle;

double(*fn)(int*);

intx;

char*error;

lib_handle = dlopen("./libctest.so", RTLD_LAZY);

if(!lib_handle)

{

fprintf(stderr,"%s\n", dlerror());

exit(1);

}

fn = dlsym(lib_handle,"ctest1");

if((error = dlerror()) != NULL)

{

fprintf(stderr,"%s\n", error);

exit(1);

}

(*fn)(&x);

printf("Valx=%d\n",x);

dlclose(lib_handle);

return0;

}

然后使用下面的命令编译:

gcc -rdynamic -o progdl progdl.c -ldl0b1331709591d260c1c78e86d0c51c18.png

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值