【Ubuntu】用g++生成动态库

本帖描述用g++生成动态库的过程,最终可使自己编写的函数能像C++库函数一样,用链接动态库的方式来调用,不再需要把function.cfunction.h文件放到工程目录下。

一、生成动态库文件 libxxx.so

1. 动态库的优势

假设我已有两个文件:function.hfunction.c,存的分别是某函数funtion的声明定义

如果不生成动态库,那么我在另一个文件如main.c中想调用函数function()时,就必须把function.hfunction.c复制与main.c相同的路径下。如果我有10个工程都用到了函数function(),那么就要把function.hfunction.c复制10次,不仅麻烦,且浪费内存。

如果有了动态库,那么每次想调用函数function(),只需在用 g++ 编译main.c时,加上-lfunction选项即可,表示链接到function库。这样,不论有多少个工程,我们都只需要一个动态库。

2. 生成动态库文件 libxxx.so

在包含function.hfunction.c的目录下,打开Linux终端,执行如下命令:

g++ function.c -I ./ -fPIC -shared -o libfunction.so

下面解释一下这条命令:

  • function.c 是我们要操作的目标源文件
  • 因为function.c中有#include "function.h",所以我们要在用 g++ 编译时给出function.h文件的位置。在 g++ 命令中,用-I选项标识.h文件的位置,此处我们的function.hfunction.c在同一路径下,因此用命令** -I ./,其中./**表示当前所在路径。
  • -fPIC表示生成的是位置无关码(涉及理论,请自行百度)
  • -shared表示这条命令的目标是生成动态库
  • -o用来指定输出文件的名字,-o libfunction.so表示生成文件名为libfunction.so

为什么生成的动态链接库名为libfunction.so?是固定格式吗?

确实是固定格式。
linux系统中的动态链接库必须名为libxxx.so,其中,xxx由人为定义,一般为库名。
这样,我们在用g++链接这个库时,就可以用g++ main.c -lxxx来链接。其中,main.c是要调用函数库xxx的源文件,而-lxxx表示链接到xxx库。

二、把动态库文件 libxxx.so 移动到系统目录下

为了使 g++ 能找到 libxxx.so,我们必须把libxxx.so移动到指定的系统目录下。**g++**默认在运行时自动去这个目录中找库文件。

执行如下命令:

sudo cp libxxx.so /lib/x86_64-linux-gnu/

这样,就把libxxx.so移动到了目录/lib/x86_64-linux-gnu/下,g++ 默认会在/lib/x86_64-linux-gnu/目录中自动查找库文件。

另外, 还需把function.h放到指定位置。

执行如下命令:

sudo mkdir /usr/include/function
sudo cp function.h /usr/include/function 

这样,就把function.h放到了/usr/include/function,这个目录也是g++默认的、会去自动查找头文件的目录。同时,大部分函数库的头文件都存放在/usr/include/这个目录中。


至此,我们的工作就结束了。以后若在某程序 main.c 中用到了函数function,只需在编译 main.c 时,执行 g++ main.c -lfunction 命令即可,不需再把 function.hfunction.c移来移去。




今天在逛Ubuntu论坛时看到一篇2006年的帖子回答的智慧,讲的是回答别人问题时的规范。反观现在的帖子或博客,已经少有人能带着这样的规范和心态来写作了。不得不感叹前辈的才华智慧以及谦虚的态度,以后也要用这样的标准来规范自己的写作和学习。

1. Don't answer questions to which you don't know the answer(不回答自己不知道答案的问题)

2. Explain yourself (解释给自己)
如果自己是提问者,你的回答是否能让自己明白?


3. Give as little assistance as necessary (尽可能的给最少的帮助)
有的时候启发性的回答更为有效.

4. Show your workings (展示你的做法)

5. Use humour judiciously (明智地使用幽默)
有的时候因为不同语境/语言的问题,你的俏皮话可能会让提问者更加困惑。

6. If you can't say something nice don't say anything atall(如果你不能说出有用的内容,就别说)

7. Avoid jargon, baffling acronyms and idiolects(避免行话、令人困惑的缩写词、习惯用语)

8. Never never never just respond with RTFM. Not ever.(永远永远永远不要回复RTFM)
这里的 RTFM 代表"Read The Fucking Manual", "去读该死的手册".
另外一个常见的是: STFW --Search The Fucking Web,
"搜索该死的网络",或者友好一点的 "Google 一下".
对于中文论坛上,我觉得还有一个尽量不要说 "RPWT" --人品问题

9. Meditate on eternity (永远的深思熟虑)
回答的问题,可能在不久以后会被别人搜索到,看到,甚至是被你将来的老板看到。一
个欠缺思索的回答无疑会降低你在其他技术人员心目中的形象。

10. Keep your newbie mind (保持自己的"新手"思维)
学无止境

保持谦卑。回答并不意味着你是"给予", 可能你也在学习.
不要认为回答了一些问题自己就成了 Guru 了.

---
把问题先交给google,然后再交给你的朋友。。。

猜你喜欢

转载自blog.csdn.net/qq_39642978/article/details/114138342
今日推荐