c++构建工具之make使用小结

本文总结了C++中make工具的使用,包括如何生成和链接静态库与动态库。详细阐述了编译动态库时的-fPIC选项,以及链接库时-L和-l的用法。此外,还介绍了动态库的加载方式,如显式加载与隐式加载,并提供了查看程序动态库依赖及配置环境变量的相关命令。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.动态库静态库的生成

编译生成静态库步骤:

第一步,生成目标文件。

  gcc -c test.c

第二步,把目标文件归档。

  ar r libtest.a test.o

  file libtest.a

编译生成动态库步骤:

     gcc demo.c -fPIC -shared -o libtest.so

由以上命令生成动态库libtest.so,为了不需要动态加载动态库,在命令时需以lib开头以.so为后缀。

–fPIC:表示编译为位置独立的代码,不用此选项的话编译后的代码是位置相关的所以动态载入时是通过代码拷贝的方式来满足不同进程的需要,而不能达到真正代码段共享的目的。

–shared:指明编译成动态库。


2.动态库静态库的链接

编译链接静态库

  gcc demo.c -ltest -L. -static -o demo

编译链接动态库

  gcc test.c –L . –ltest –o test

        -L:指明动态库所在的目录

        -l:指明动态库的名称,该名称是处在头lib和后缀.so中的名称,如上动态库libtest.so的l参数为-l test。

-ltest -L./lib 指定链接库路径

-wl,-rpath /home/Tim/demo/lib 指定搜索链接库路径

-wl,-Bstatic 后面的-l使用静态库链接

-wl,-Bdynamic 后面的-l使用动态库连接

显式加载与隐式加载

显式加载通过编译是链接符号表,运行时由系统搜索加载动态库

隐式加载通过程序运行时调用下面几个系统调用手动加载动态库

dlopen 用于库的打开
dlerror 用于错误检测
dlsym 用于获取库中函数指针
dlclose 关闭动态库,手动加载动态库


3.动态库静态库的加载

ldd test 查看执行程序的动态库依赖

nm libtest.so 查看动态库的符号

strings libtest.so 查看动态库中字符串

strip libtest.so 脱去动态库中符号信息

sudo lsof -p pid 查看运行进程的动态库依赖

env 查看当前shell用户环境变量

sudo env 查看切换sudo环境变量

export ld_library_path 配置动态库路径

pkg-config 配置搜索动态库路径命令

vi /etc/profile 配置环境变量到系统配置文件

source /etc/profile 使系统配置文件立即生效

vi ld.so.conf 查看系统动态库共享目录配置

sudo ldconfig 使系统动态库共享目录生效

sudo visudo 修改执行sudo切换时保留当前用户shell环境

sudo cat /etc/sudoers

Defaults        env_keep+="ld_library_path"

4.参考资料

http://man.linuxde.net/ldconfig

http://blog.chinaunix.net/uid-24641004-id-5028821.html

https://www.cnblogs.com/zhangsir6/articles/2956798.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值