这里主要是讲动态库的问题。
当编辑好动态库的源代码之后,使用下面的命令进行编译。
所谓的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里面,具体如下。
这样就可以将函数暴露给C了。
而如果要在C++里面调用C的函数的话,也是要做相应的一些操作的。我们需要在编译C++程序的时候,让编译器之后我们调用的函数是从C里面来的。
在C++里面将函数声明放在extern "C" directive后面就可以了。如下:
使用动态加载的方式加载函数库
需要使用dlfcn.h函数库。如下是一个使用的过程的例子:
然后使用下面的命令编译:
gcc -rdynamic -o progdl progdl.c -ldl