记录gcc便编译遇到的问题和积累的经验
文章目录
- 一、 编译命令
- 编译过程
- 第二章 遇到问题
- 一、编译的动态库无法正常运行
- 1)设置环境变量 LD_LIBRARY_PATH
- 2)使用rpath将共享库位置嵌入到程序
- 3)将so共享库添加到系统路径
- 第三章 实用命令
- 一、ldd查看动态库的链接库信息
- 二、readelf -d libencrypt.so查看动态库的基本信息
- 三、echo $PATH
- 四、nm -D encrypt.so | grep encrypt,查找函数
一、 编译命令
编译过程
预处理(Pre-Processing)–>编译(Compiling)–>汇编(Assembling)–>链接(Linking)
后缀 | 描述 |
---|---|
.c | C 源文件 |
.C/.cc/.cxx/.cpp | C++ 源文件 |
.h | C/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更新共享库的缓存列表