gcc编译初探

本文详细讲述了在使用GCC编译过程中遇到动态库无法正常运行的问题,介绍了设置LD_LIBRARY_PATH、使用rpath和将so库添加到系统路径等解决方法,同时提供了查看动态库链接信息、基本属性和查找函数的实用命令,以及ldconfig的作用。

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

记录gcc便编译遇到的问题和积累的经验



一、 编译命令

编译过程

预处理(Pre-Processing)–>编译(Compiling)–>汇编(Assembling)–>链接(Linking)
在这里插入图片描述

后缀描述
.cC 源文件
.C/.cc/.cxx/.cppC++ 源文件
.hC/C++ 头文件
.i/.ii经过预处理的C/C++文件
.s/.S汇编语言源文件
.o/.obj目标文件
.a/.lib静态库
.so/.dll动态库
gcc -fPIC -I /home/test/testdefault/tools/java/jdk1.8.0_152/include/ -I /home/test/testdefault/tools/java/jdk1.8.0_152/include/linux/ -I /home/up_ss/openssl-1.1.1u/include -L/opt/openssl/lib64 -lcrypto -lssl  -Wl,-rpath=/opt/openssl/lib64 -shared -o libencrypt.so com_mdcp_test_business_service_DevEncryptJni.c

看上面的编译命令很长,实际上只需要记住以下几个常用的参数即可:

参数说明
-I指定头文件的路径,需要include的文件
-L指定链接库的路径
-l指定需要链接的具体库名
-shared创建共享库/动态库
-static使用静态链接
-Wl将逗号分隔的 传递给链接器(linker)
-rpath指定运行时库路径
-o指定输出文件

第二章 遇到问题

一、编译的动态库无法正常运行

通过指定rpath解决,该问题可以通过以下三种方式处理:

1)设置环境变量 LD_LIBRARY_PATH

export LD_LIBRARY_PATH=$(pwd)

2)使用rpath将共享库位置嵌入到程序

rpath 即 run path,是种可以将共享库位置嵌入程序中的方法,从而不用依赖于默 认位置和环境变量。

3)将so共享库添加到系统路径

sudo cp libfoo.so /usr/lib/

如果依然无法运行,可以尝试执行ldconfig命令更新共享库的缓存列表。

第三章 实用命令

一、ldd查看动态库的链接库信息

AAS-TEST:~/ttt # ldd libencrypt.so
linux-vdso.so.1 (0x00007ffd1b269000)
libcrypto.so.1.1 => /opt/openssl/lib64/libcrypto.so.1.1 (0x00007f80a378a000)
libssl.so.1.1 => /opt/openssl/lib64/libssl.so.1.1 (0x00007f80a34d9000)
libz.so.1 => /opt/openssl/lib64/libz.so.1 (0x00007f80a32bd000)
libc.so.6 => /lib64/libc.so.6 (0x00007f80a2f18000)
libdl.so.2 => /lib64/libdl.so.2 (0x00007f80a2d14000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f80a2af7000)
/lib64/ld-linux-x86-64.so.2 (0x00007f80a3ecb000)

二、readelf -d libencrypt.so查看动态库的基本信息

在这里插入图片描述

三、echo $PATH

查看系统LD_LIBRARY_PATH动态库路径

四、nm -D encrypt.so | grep encrypt,查找函数

AAS-TEST:~/ttt # nm -D encrypt.so | grep encrypt
0000000000002021 T Java_com_mdcp_test_business_service_DevEncryptJni_encryptByModule
0000000000001b52 T encrypt
五、ldconfig更新共享库的缓存列表


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值