参考编译出错Relocations in generic ELF (EM: 62)

其实是因为在别人电脑拿到代码,Makefile编译路径不一样,导致的

qmake -o Makefile xxxx.pro

如果是特殊路径的qmake,可以打开Makefile,开头有写Makefile生产方法
在这里插入图片描述

我的执行/opt/rk3288/qt-new/bin/qmake -o Makefile Safbox_GUI.pro
就重新生成Makefile了

需要换成你的编译链qmake所在位置


  1. 编译 — > 编译 — > 汇编 — > 链接
1、预编译预处理器对c程序进行一些预处理工作例如对宏定义变量进行替换1)将所有的#define删除,并展开所有的宏定义2处理所有的预编译指令例如:#if,#elif,#else,#endif;
    3处理#include编译指令,将被包含的文件插入到预编译指令位置4添加行号信息文件名信息,便于调试5删除所有的注释// /**/;
    6)保留所有的#pragma编译指令,因为在编写程序的时候,我们经常要用到#pragma指令来 设定编译器状态
                                                                    或者是指示编译器完成一些特定的动作最后生成.i文件;
    总的来说,包括(1)去注释 (2)宏替换 (3头文件展开4条件编译
    
2、编译:编译器c语言程序翻译汇编语言程序1扫描语法分析语义分析源代码优化目标代码生成目标代码优化;
    2)生成汇编代码3汇总符号4)生成.s文件;
    
3、汇编:汇编语言通过汇编器编译成可重定位目标程序.o,与之相反称为反汇编;
    1)根据汇编指令和特定平台,把汇编指令翻译二进制形式;
    2合并各个section合并符号表;
    3)生成.o文件;
    
4链接:将目标文件和所需的库函数链接器进行链接,常见的链接器有Unix;
    1合并各个.obj文件的section合并符号表,进行符号解析2)符号地址定位3)生成可执行文件预处理gcc -E project.c -o project.i //宏展开,宏替换 
编译:    gcc -S project.i -o project.s //将目标文件编译成汇编文件
汇编:    gcc -c project.s -o project.o //汇编成二进制文件
链接:    gcc project.o -o project  //加载库文件,生成可执行文件

注意:
头文件不参与编译

  1. 简单说⼏个你使⽤过的⼆进制⼯具集

gcc g++ gdb
链接器 :ld [将.o文件链接生成一个.elf文件]
目标拷贝/格式化工具 : objcopy [将elf文件转换生成bin的文件]
反汇编工具 : objdump [将elf文件反汇编生成dis的反汇编文件]
查看文件符号表 : nm [查看elf文件的符号表]
查看二进制文件各个段的大小 :size [查看elf文件中各个段的大小]
获取 elf 文件信息的 :readelf [读取elf文件的信息]
压缩文件体积 : strip
根据地址信息定位错误的信息的详细位置信息 :addr2line

3.库有两种:静态库(.a.lib)和动态库(.so.dll

所谓静态、动态是指链接
参考:静态库和动态库的区别



参考:C/C++内存分布

1、malloc/free和new/delete区别

  • 共同点:

都是从堆上申请空间,并且需要用户手动释放

  • 不同点:
  1. malloc和free是函数newdelete操作符

  2. malloc申请的空间不会初始化new可以初始化

  3. malloc申请空间时,需要手动计算空间大小并传递,new只需在其后跟上空间类型即可

  4. malloc返回值void*, 在使用时必须强转,new不需要,因为new后跟的是空间类型

  5. malloc申请空间失败时,返回的是NULL,因此使用时必须判空,new不需要,但是new需要捕获异常

  6. 申请自定义类型对象时,malloc/free只会开辟空间,不会调用构造函数与析构函数,而new在申请空间后会调用构造函数完成对象初始化delete在释放空间前会调用析构函数完成空间中资源清理

2、如何一次在堆上申请4G的内存

对于32位的栈来说虚拟地址空间有2个G的空间大小

对于64位的栈来说虚拟地址空间的空间大小是非常大的

示例

// 将程序编译成x64的进程运行下面的程序
#include <iostream>
using namespace std;
int main()
{
	void* p = new char[0xfffffffful];
	cout << "new:" << p << endl;
	return 0;
}

1G = 2^30 Bytes
ul:为无符号长整型
0xffff ffff = 4294967295
(4294967295+1) / 2^30 = 4 G

0x7FFFFFFF = 2147483647
(2147483647+1) / 2^30 = 2 G

原文地址:https://blog.csdn.net/qq_47355554/article/details/128073543

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任

如若转载,请注明出处:http://www.7code.cn/show_20092.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱suwngjj01@126.com进行投诉反馈,一经查实,立即删除

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注