gcc编译初探

记录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)
在这里插入图片描述

后缀描述
.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更新共享库的缓存列表


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/539503.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

RN滚动选择组件react-native-wheel-picker-android

安装组件 yarn add react-native-wheel-picker-android我这里的版本为"react-native-wheel-picker-android": "^2.0.6", 示例代码 import { useState } from react import { View } from react-native import { WheelPicker } from react-native-wheel-…

字节飞书前端实习面试

属于是被字节狠狠地拷打了。面试官人很好,让人感觉有很沉稳的感觉。问了一大堆关于底层的问题,属于是把我整麻了。 项目部分问的不多,主要问的都是一些前端涉及的底层知识,层层递进。 1.vue3的响应式是如何实现的 2.computed和wat…

mysql事务(MVCC机制:undo日志)(mysql执行过程:redo日志,Buffer Pool缓存池)

事务 目的:保证数据的最终一致性## 事务的目的 事务的4大特性(ACID) 1.原子性(Atomicity):由undo log日志来保证 2.一致性(Consistency):使用事务的最终目的,由业务代码正确逻辑保证,比如错误的try-catch 3.隔离性(Isolation):…

Unreal发布Android在刘海屏手机上不能全屏显示问题

Unreal 4.27发布Android在刘海屏手机上不能全屏显示问题 Android设置全屏刘海屏全屏设置4.27设置刘海屏在部分手机不能显示问题 Android设置全屏 AndroidManifest.xml文件配置 ...<activity android:name"com.epicgames.ue4.GameActivity" android:label"st…

钉钉魔法盒:解锁企业数字化转型新密码

在数字化的浪潮中&#xff0c;一家公司在企业团队管理和商场综合运营中致力于实现数字化转型。于是&#xff0c;该公司在与无雀科技商讨后&#xff0c;决定引入钉钉平台&#xff0c;不仅要打造商业地产平台&#xff0c;更要优化团队管理流程&#xff0c;提升组织运营效率。 针对…

学习JAVA的二十二天(基础)

目录 网络编程 三要素&#xff1a; IP InetAddress类 端口号 协议 UDP协议 TCP协议 前言&#xff1a;学习JAVA的第二十一天&#xff08;基础&#xff09;-CSDN博客 网络编程 在网络通信协议下&#xff0c;不同计算机上运行的程序,进行的数据传输。 三要素&#xff1a;…

使用Python进行自然语言处理(NLP):NLTK与Spacy的比较【第133篇—NLTK与Spacy】

使用Python进行自然语言处理&#xff08;NLP&#xff09;&#xff1a;NLTK与Spacy的比较 自然语言处理&#xff08;NLP&#xff09;是人工智能领域的一个重要分支&#xff0c;它涉及到计算机如何理解、解释和生成人类语言。在Python中&#xff0c;有许多库可以用于NLP任务&…

ACM记忆化DFS与基于优先队列的BFS

基本概念--记忆化DFS 使用数组保存已经算出来的值&#xff0c;在后续的计算中减少大量的重复计算&#xff0c;提高效率。&#xff08;用于dp不方便&#xff0c;但是搜索方便的情况&#xff0c;可以提升效率。&#xff09; eg. 记忆化dfs求解斐波那契数列 int dfs(int n) {if…

【Node.js从基础到高级运用】十二、身份验证与授权:JWT

身份验证与授权是现代Web应用中不可或缺的部分。了解如何在Node.js应用中实施这些机制&#xff0c;将使你能够构建更安全、更可靠的应用程序。本文将引导你通过使用JWT实现用户注册、登录和权限控制的过程。 JWT&#xff08;Json Web Token&#xff09; JWT是一种用于双方之间…

前端vue3-手动设置滚动条位置

从B页面进行xx操作后需要跳转到A页面&#xff0c;并定位到AA职位&#xff0c;上图为A页面。 A页面的左侧是div&#xff0c;内层包裹List组件 给div定义refleftRef,在代码中写如下&#xff1a; function scrollTop() {if (leftRef.value) {console.log(99, leftRef.value);next…

【C#算法实现】可见的山峰对数量

文章目录 前言一、题目要求二、算法设计及代码实现2.1 算法思想2.2 代码实现 前言 本文是【程序员代码面试指南&#xff08;第二版&#xff09;学习笔记】C#版算法实现系列之一&#xff0c;用C#实现了《程序员代码面试指南》&#xff08;第二版&#xff09;栈和队列中的可见的…

多线程(代码案例: 单例模式, 阻塞队列, 生产者消费者模型,定时器)

设计模式是什么 类似于棋谱一样的东西 计算机圈子里的大佬为了能让小菜鸡的代码不要写的太差 针对一些典型的场景, 给出了一些典型的解决方案 这样小菜鸡们可以根据这些方案(ACM里面叫板子, 象棋五子棋里叫棋谱, 咱这里叫 设计模式), 略加修改, 这样代码再差也差不到哪里去 … …