linux下动态链接库解决方案(二)

以前写过一个关于linux下用c++写动态链接库无法通过的解决方案,今天看到《linux C程序设计-王者归来》这本书,书中有个更容易的解决方案,特此记录下来

书中使用的是c语言,我改用c++试了一下,依旧可以运行:

先来写动态库文件:

//lib.cpp
1
int add(int a,int b) 2 { 3 return a+b; 4 } 5

(*前面写过一个复杂的,这次就简单些举个例子吧*)

书中运用了导出外部函数的做法,先写了一个使用库函数的头文件

//lib.h
extern int add(int,int);

然后写调用函数的main函数

//main.cpp
#include<iostream> #include"lib.h" using namespace std; int main() { int a=5; int b=6; int c; c=add(a,b); cout<<c<<endl; return 0; }

(*注意,这里并没有包含dlfcn.h头文件,也就是并没有使用linux系统库函数来调用动态链接库)

下面就是编译方法的问题了:

对lib.cpp文件使用命令:

g++ -shared -fPIC -o lib.so lib.cpp

执行完成后会得到lib.so文件

下面这一步很重要,要对main.cpp进行编译,执行命令:

g++ main.cpp ./lib.so -o main

(*这里也不实用-ldl操作符来限定)

会自动生成main文件,你去执行一下这个文件,就会发现库函数已经被执行了,比起调用系统调用和extern “C”去消除重载要简单了很多。

(**补充**)

我对比了一下两种方式编译出来的文件(方法一参见博客同分类下的《linux下动态链接库解决方案(一)》)

上图中,代表号2的都是上一次那种方式编译出来的文件,会发现:

本次方式编译出的文件,可执行文件(main相比于main2)较小,而动态链接库文件(lib.so相比于lib2.so)则稍大

通过对比,我个人还是建议使用本次方式编译文件,虽然 编译出来的动态库文件稍大(其实大不了多少),但编译出来的可执行文件就远远小于上一次提出的方式了。

整体看来还是这种方式简单……

原文地址:https://www.cnblogs.com/zlgxzswjy/p/5436483.html