gcc编译
一、GCC简介
- 预处理(Pre-Processing):生成 .i 的文件[预处理器cpp]
- 编译(Compiling): 将预处理后的文件转换成汇编语言, 生成文件 .s [编译器egcs]
- 汇编(Assembling): 由汇编变为目标代码(机器代码)生成 .o 的文件[汇编器as]
- 链接生成可执行文件(Linking) [链接器ld]
# 安装c编译器(linux需安装python-devel, gcc)
centos: yum install python-devel gcc
ubuntu: apt-get install build-essential
二、GCC使用
nist@zq-node2:~/test$ gcc --help
Usage: gcc [options] file...
Options:-pass-exit-codes 从一个阶段以最高错误代码退出.--help Display this information.--target-help 显示特定于目标的命令行选项.--help={common|optimizers|params|target|warnings|[^]{joined|separate|undocumented}}[,...].显示特定类型的命令行选项.(使用 '-v --help' 显示子进程的命令行选项).--version 显示编译器版本信息.-dumpspecs 显示所有内置规范字符串.-dumpversion 显示编译器的版本.-dumpmachine 显示编译器的目标处理器.-print-search-dirs 显示编译器搜索路径中的目录.-print-libgcc-file-name 显示编译器配套库的名称.-print-file-name=<lib> 显示库 <lib> 的完整路径.-print-prog-name=<prog> 显示编译器组件 <prog> 的完整路径.-print-multiarch 显示目标的规范化 GNU 三元组,用作库路径中的一个组件.-print-multi-directory 显示 libgcc 版本的根目录.-print-multi-lib 显示命令行选项和多个库搜索目录之间的映射.-print-multi-os-directory 显示操作系统库的相对路径.-print-sysroot 显示目标库目录.-print-sysroot-headers-suffix 显示用于查找headers的sysroot后缀.-Wa,<options> 将逗号分隔的 <options> 传递给汇编器(assembler).-Wp,<options> 将逗号分隔的 <options> 传递给预处理器(preprocessor)-Wl,<options> 将逗号分隔的 <options> 传递给链接器(linker)-Xassembler <arg> 将 <arg> 传递给汇编器(assembler).-Xpreprocessor <arg> 将 <arg> 传递给预处理器(preprocessor).-Xlinker <arg> 将 <arg> 传递给链接器(linker).-save-temps 不用删除中间文件.-save-temps=<arg> 不用删除指定的中间文件.-no-canonical-prefixes 在构建其他 gcc 组件的相对前缀时,不要规范化路径.-pipe 使用管道而不是中间文件-time 为每个子流程的执行计时.-specs=<file> 使用 <file> 的内容覆盖内置规范.-std=<standard> 假设输入源用于<standard>。--sysroot=<directory> 使用<standard>作为headers和libraries的根目录.-B <directory> 将 <directory> 添加到编译器的搜索路径.-v 显示编译器调用的程序.-### 与 -v 类似,但引用的选项和命令不执行.-E 仅执行预处理(不要编译、汇编或链接).-S 只编译(不汇编或链接).-c 编译和汇编,但不链接.-o <file> 指定输出文件. gcc 编译出来的文件默认是 a.out-pie 创建一个动态链接、位置无关的可执行文件-shared 创建共享库/动态库.-g: 生成调试信息-w: 不生成任何警告-Wall: 编译时 显示Warning警告,但只会显示编译器认为会出现错误的警告-x <language> 指定以下输入文件的语言。允许的语言包括:c c++汇编程序none“none”表示恢复到的默认行为根据文件的扩展名猜测语言。
Options starting with -g, -f, -m, -O, -W, or --param are automaticallypassed on to the various sub-processes invoked by gcc. In order to passother options on to these processes the -W<letter> options must be used.
For bug reporting instructions, please see:
<file:///usr/share/doc/gcc-9/README.Bugs>.-shared:
编译动态库时要用到
-pthread:
在Linux中要用到多线程时,需要链接pthread库
-fPIC:
作用于编译阶段,告诉编译器产生与位置无关代码(Position-Independent Code),
则产生的代码中,没有绝对地址,全部使用相对地址,故而代码可以被加载器加载到内存的任意
位置,都可以正确的执行。这正是共享库所要求的,共享库被加载时,在内存的位置不是固定的。
-fwrapv:
它定义了溢出时候编译器的行为——采用二补码的方式进行操作
-O参数
这是一个程序优化参数,一般用-O2就是,用来优化程序用的
-O2:
会尝试更多的寄存器级的优化以及指令级的优化,它会在编译期间占用更多的内存和编译时间。
-O3: 在O2的基础上进行更多的优化
-Wall:
编译时 显示Warning警告,但只会显示编译器认为会出现错误的警告
-fno-strict-aliasing:
“-fstrict-aliasing”表示启用严格别名规则,“-fno-strict-aliasing”表示禁用严格别名规则,当gcc的编译优化参数为“-O2”、“-O3”和“-Os”时,默认会打开“-fstrict-aliasing”。
-I (大写的i):
是用来指定头文件目录
-I /home/hello/include表示将/home/hello/include目录作为第一个寻找头文件的目录,寻找的顺序是:/home/hello/include-->/usr/include-->/usr/local/include
-l:
-l(小写的 L)参数就是用来指定程序要链接的库,-l参数紧接着就是库名,把库文件名的头lib和尾.so去掉就是库名了,例如我们要用libtest.so库库,编译时加上-ltest参数就能用上了 2.1、gcc编译的四个步骤
预处理: gcc -E Test.c -o Test.i # -E选项,可以让编译器在预处理后停止,并输出预处理结果
编译: gcc -S Test.i -o Test.s # -S选项,表示在程序编译期间,将我们的代码编译成汇编语言。
汇编: gcc -c Test.s -o Test.o # -c选项,表示由汇编器负责将刚才的.s文件编译为目标文件,即计算机所能识别的序列。
链接生成可执行文件: gcc Test.o -o Test # 将刚才的Test.o文件与C标准输入输出库进行连接,最终生成程序Test可执行文件 2.2、多源文件的编译方法
gcc testfun.c test.c -o test 作用:将testfun.c和test.c分别编译后链接成test可执行文件。
gcc -c testfun.c -o testfun.o # 将testfun.c编译成testfun.o
gcc -c test.c -o test.o # 将test.c编译成test.o
gcc -o testfun.o test.o -o test # 将testfun.o和test.o链接成test 2.3、库文件连接
- ld会去找GCC命令中的参数-L
- 再找gcc的环境变量LIBRARY_PATH
- 再找内定目录 /lib、 /usr/lib、 /usr/local/lib 这是当初compile gcc时写在程序内的
- 编译目标代码时指定的动态库搜索路径
- 环境变量LD_LIBRARY_PATH指定的动态库搜索路径
- 配置文件/etc/ld.so.conf中指定的动态库搜索路径
- 默认的动态库搜索路径/lib
- 默认的动态库搜索路径/usr/lib
- LIBRARY_PATH环境变量:指定程序静态链接库文件搜索路径
- LD_LIBRARY_PATH环境变量:指定程序动态链接库文件搜索路径
三、示例
3.1、阶段编译
#include <stdio.h>int main(void)
{printf("Hello, GetIoT\n");return 0;
} gcc hello.c gcc hello.c -o hello
gcc -E hello.c -o hello.i gcc -S hello.c -o hello.s gcc -S hello.i -o hello.s gcc -c hello.c -o hello.o gcc -c hello.i -o hello.o
gcc -c hello.s -o hello.o gcc hello.o -o hello 3.2、使用静态库
#include <stdio.h>void foo(void)
{printf("Here is a static library\n");
} gcc -c foo.c # 生成 foo.o 目标文件
ar rcs libfoo.a foo.o # 生成 libfoo.a 静态库
#include <stdio.h>
void foo(void);int main(void)
{printf("Hello, GetIoT\n");foo();return 0;
} gcc hello.c -static libfoo.a -o hello gcc hello.c -static -L. -lfoo -o hello
3.3、使用共享库
#include <stdio.h>void foo(void)
{printf("Here is a shared library\n");
} gcc foo.c -shared -fPIC -o libfoo.so
#include <stdio.h>
void foo(void);int main(void)
{printf("Hello, GetIoT\n");foo();return 0;
} gcc hello.c libfoo.so -o hello gcc hello.c -L. -lfoo -o hello $ ./hello./hello: error while loading shared libraries: libfoo.so: cannot open shared object file: No such file or directory
$ ldd hello
linux-vdso.so.1 (0x00007fff5276d000)
libfoo.so => not found
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fcc90fa7000)
/lib64/ld-linux-x86-64.so.2 (0x00007fcc911bd000) export LD_LIBRARY_PATH=$(pwd) gcc hello.c -L. -lfoo -Wl,-rpath=`pwd` -o hello sudo cp libfoo.so /usr/lib/ 相关文章:
gcc编译
一、GCC简介 GCC(GNU Compiler Collection)是 GNU 工具链的主要组成部分,是一套以 GPL 和 LGPL 许可证发布的程序语言编译器自由软件,由 Richard Stallman 于 1985 年开始开发。 GCC 原名为 GNU C语言编译器,因为它原本…...
华为云服务器租用费用及CPU性能(1核2G/2核4G/4核8G)
华为云HECS云服务器即云耀云服务器,类似于阿里云和腾讯云的轻量应用服务器,HECS云服务器1核2G配置39.02元一年、2核4G配置99元一年、4核8G配置69.94元3个月,华为云百科分享华为云HECS云服务器租用费用及CPU性能详解: 目录 华为云…...
Redis---事务管道
目录 一、Redis的事务是什么? 1.1 Redis和关系型数据库事务的区别 二、怎么玩Redis事务? 2.1 正常执行: 2.2 放弃事务 2.3 全体连坐 2.4 冤头债主 2.5 watch监控 三、管道 3.1 为什么会引入管道这个概念呢?我们首先来看一…...
Python的内置数据类型(通过故事来学习)
有一天,小李在学习Python语言时,听到了一个关于内置数据类型的故事。 Python内置了很多数据类型,比如整数、浮点数、字符串、布尔值等等。这些数据类型可以帮助我们更方便地处理数据,提高代码的效率。 小李很好奇,就…...
继瑞吉外卖后的又一个项目——SpringBoot+Vue的前后端博客系统
文章目录 博客系统项目介绍前言项目演示前台演示后台演示 组织结构后端组织结构前端组织结构 技术选型前端技术后端技术架构图系统架构图业务架构图 模块介绍前端模块后端模块 环境搭建开发工具开发环境项目运行 未完待续结语 博客系统项目介绍 前言 本项目已开源在Gitee 后端…...
2023暑期实习历程总结
一.前言 Hello 大家好久不见,已经三个月左右没有更新了,那我这三个月在干什么呢?自2023年3月中旬开始到现在五月底这期间接近三个月的时间里,我一直在进行2023暑期实习的投递和面试。这期间投递了包括各大中厂(阿里&am…...
UART-STM32
UART-STM32 通信的目的:将一个设备的数据传送到另一个设备,扩展硬件系统 通信协议:制定通信的规则,通信双方按照协议规则进行数据收发 第一步,开启时钟,把需要用的USART和GPIO的时钟打开 第二步,GPIO初始化,把TX配置成复用输出,RX配置成输入 第三步,配置USART,直接使…...
jetson nano csi摄像头 tensorrt 运行yolov8检测
jetson nano csi摄像头 tensorrt 运行yolov8检测 基于原始onnx模型的tensorrt预测1. 在本地电脑训练环境下将onnx模型导出yolov8 导出onnx 模型2. 在jetson nano下 转换到tensorrt模型配置好环境后 使用trtexec 生成engine3. 使用python3 tensorrt 读取csi摄像头进行预测修改on…...
提升国际品牌影响力:小企业海外网红营销实战指南
在当今数字化时代,小企业们越来越意识到海外市场的巨大潜力。与此同时,海外网红的崛起也为小企业提供了一个独特的机会,通过与他们合作,迅速拓展国际市场并吸引更多目标受众的关注。然而,对于许多小企业来说࿰…...
从零开始的力扣刷题记录-第三十九天
力扣每日四题 228. 汇总区间-简单1431. 拥有最多糖果的孩子-简单637. 二叉树的层平均值-简单49. 字母异位词分组-中等总结 228. 汇总区间-简单 题目描述: 给定一个 无重复元素 的 有序 整数数组 nums 。 返回 恰好覆盖数组中所有数字 的 最小有序 区间范围列表 。也…...
PDPS教程:机器人工作站导出为JT格式文件操作方法
目录 功能简介 功能注意事项 导出JT格式文件操作 导出JT格式文件查看 功能简介 PDPS软件不仅能够从外部导入JT格式的模型文件,还能够将创建好的机器人工作站/生产线导出为JT格式的模型文件。这个能够导出JT格式文件的功能就是“Export JT”命令。 使用“Expor…...
【面试】为什么Mysql用B+树做索引而不用B-树或红黑树
文章目录 前言一、B树只有叶节点存放数据,其余节点用来索引,而B-树是每个索引节点都会有Data域。二、那么Mysql如何衡量查询效率呢?三、B树相对于红黑树的区别 前言 原因如下: B树能显著减少IO次数,提高效率B树的查询…...
教你如何选择真正有用的防关联指纹浏览器
从事亚马逊、eBay、Shopify等电商平台的卖家都知道,如果我们需要在这些平台上经营多个店铺,需要使用多个账号为店铺进行评价,在Facebook和Instagram上做SEO和广告,通常也需要使用一个防关联指纹浏览器。 防关联指纹浏览器主要解决…...
某程序员哀叹:月薪四五万,却每天极度焦虑痛苦,已有生理性不适,又不敢裸辞,该怎么办?
高薪能买来快乐吗? 来看看这位程序员的哀叹: 实在是扛不住了,每天都在极度焦虑和痛苦中度过,早上起来要挣扎着做心理建设去上班,已经产生生理性的头晕恶心食欲不振。有工作本身的原因,更多是自己心态的问…...
不愧是腾讯出来的,太厉害了...
前段时间公司缺人,也面了许多测试,一开始瞄准的就是中级水准,当然也没指望能来大牛,提供的薪资在15-20k这个范围,来面试的人有很多,但是平均水平真的让人很失望。看了简历很多上面都是写有4年工作经验&…...
2023年上半年系统集成项目管理工程师上午真题及答案解析
1.在( )领域我国远末达到世界先进水平,需要发挥新型国家体制优势,集中政府和市场两方面的力量全力发展。 A.卫星导航 B.航天 C.集成电路 D.高铁 2.ChatGPT 于2022年11月30日发布,他是人工智能驱动( )。 …...
psd文件丢失了怎么恢复?分享原因及对应恢复方法
PSD文件在设计行业中非常重要。但是,不幸的是,有时这些文件可能会因多种原因而丢失。那么在未备份PSD文件的情况下,PSD文件丢失了怎么恢复呢?如果您遇到了这种问题,不要惊慌,在本篇文章中,我们将…...
【Netty】 工作原理详解(十一)
文章目录 前言一、Netty 模型二、代码示例2.1、引入Maven依赖2.2、服务端的管道处理器2.3、服务端主程序2.4、客户端管道处理器2.5、客户端主程序2.6、测试运行 总结 前言 回顾Netty系列文章: Netty 概述(一)Netty 架构设计(二&…...
SQL面试必备:100道高频考题解析
前言 在众多IT职场中,SQL技术一直是一个非常重要的技能点。如果你正在准备SQL相关的面试,那么这份“SQL面试 100 问”绝对是你不能错过的宝藏! 这份清单涵盖了100道高频考题,从基础知识到复杂应用都有所涉及,帮助你全…...
基于区域的图像分割
文章目录 基于区域的图像分割基本原理常用的算法实现步骤示例代码结论 基于区域的图像分割 基于区域的图像分割是数字图像处理中常用的一种方法,它通过将图像中的像素分配到不同的区域或对象来实现图像分割的目的。相比于基于边缘或阈值的方法,基于区域…...
51c自动驾驶~合集58
我自己的原文哦~ https://blog.51cto.com/whaosoft/13967107 #CCA-Attention 全局池化局部保留,CCA-Attention为LLM长文本建模带来突破性进展 琶洲实验室、华南理工大学联合推出关键上下文感知注意力机制(CCA-Attention),…...
Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility
Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility 1. 实验室环境1.1 实验室环境1.2 小测试 2. The Endor System2.1 部署应用2.2 检查现有策略 3. Cilium 策略实体3.1 创建 allow-all 网络策略3.2 在 Hubble CLI 中验证网络策略源3.3 …...
Keil 中设置 STM32 Flash 和 RAM 地址详解
文章目录 Keil 中设置 STM32 Flash 和 RAM 地址详解一、Flash 和 RAM 配置界面(Target 选项卡)1. IROM1(用于配置 Flash)2. IRAM1(用于配置 RAM)二、链接器设置界面(Linker 选项卡)1. 勾选“Use Memory Layout from Target Dialog”2. 查看链接器参数(如果没有勾选上面…...
论文浅尝 | 基于判别指令微调生成式大语言模型的知识图谱补全方法(ISWC2024)
笔记整理:刘治强,浙江大学硕士生,研究方向为知识图谱表示学习,大语言模型 论文链接:http://arxiv.org/abs/2407.16127 发表会议:ISWC 2024 1. 动机 传统的知识图谱补全(KGC)模型通过…...
Reasoning over Uncertain Text by Generative Large Language Models
https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829 1. 概述 文本中的不确定性在许多语境中传达,从日常对话到特定领域的文档(例如医学文档)(Heritage 2013;Landmark、Gulbrandsen 和 Svenevei…...
基于Java+MySQL实现(GUI)客户管理系统
客户资料管理系统的设计与实现 第一章 需求分析 1.1 需求总体介绍 本项目为了方便维护客户信息为了方便维护客户信息,对客户进行统一管理,可以把所有客户信息录入系统,进行维护和统计功能。可通过文件的方式保存相关录入数据,对…...
python爬虫——气象数据爬取
一、导入库与全局配置 python 运行 import json import datetime import time import requests from sqlalchemy import create_engine import csv import pandas as pd作用: 引入数据解析、网络请求、时间处理、数据库操作等所需库。requests:发送 …...
Docker拉取MySQL后数据库连接失败的解决方案
在使用Docker部署MySQL时,拉取并启动容器后,有时可能会遇到数据库连接失败的问题。这种问题可能由多种原因导致,包括配置错误、网络设置问题、权限问题等。本文将分析可能的原因,并提供解决方案。 一、确认MySQL容器的运行状态 …...
DiscuzX3.5发帖json api
参考文章:PHP实现独立Discuz站外发帖(直连操作数据库)_discuz 发帖api-CSDN博客 简单改造了一下,适配我自己的需求 有一个站点存在多个采集站,我想通过主站拿标题,采集站拿内容 使用到的sql如下 CREATE TABLE pre_forum_post_…...
Spring Boot + MyBatis 集成支付宝支付流程
Spring Boot MyBatis 集成支付宝支付流程 核心流程 商户系统生成订单调用支付宝创建预支付订单用户跳转支付宝完成支付支付宝异步通知支付结果商户处理支付结果更新订单状态支付宝同步跳转回商户页面 代码实现示例(电脑网站支付) 1. 添加依赖 <!…...
