当前位置: 首页 > news >正文

【Linux操作系统】编译过程中遇到的问题-为什么加-c?执行文件提示无法执行二进制文件?main函数参数argc和*argv[]的作用和理解?

在使用GCC编译器进行程序开发时,我们经常会遇到一些编译过程中的问题, 比如为什么要加上"-c"选项,以及为什么生成的可执行文件无法执行等问题。
本篇博客将详细介绍这些问题,并给出相应的代码和解释,帮助读者更好地理解GCC编译过程中的"-c"选项和main函数的参数argc和*argv[]。
在这里插入图片描述

文章目录

    • 1. 为什么要加-c,-o?各元素表示什么关系
      • 1.1 一个完整编译命令各元素的解释
      • 1.2 gcc其他的选项
    • 2. 为什么报错“无法执行二进制文件,可执行文件格式错误”
      • 2.1 报错的普遍原因
      • 2.2 编译时带上-c的作用
    • 3.main函数带上argc和*argv[]两个参数的作用
    • 结论:

1. 为什么要加-c,-o?各元素表示什么关系

1.1 一个完整编译命令各元素的解释

我们使用一个例子说明:

gcc -c hello.c -o hello

里面每个元素的含义:

  • "gcc":是GNU编译器套装(GCC)的命令行工具。
  • "-c":是GCC的一个编译选项,表示只进行编译而不进行链接。使用该选项会生成一个目标文件(.o文件),而不是可执行文件。
  • "hello.c":是要编译的源文件的名称。这里的"hello.c"是一个示例文件名,可以替换为实际的源文件名。
  • "-o":是GCC的一个选项,用于指定输出文件的名称。
  • "hello":是输出文件的名称。这里的"hello"是一个示例文件名,可以替换为实际的输出文件名。

综合起来,命令"gcc -c hello.c -o hello"的含义是:

使用GCC编译器对名为"hello.c"的源文件进行编译,生成一个目标文件,并将该目标文件命名为"hello"。
注意,该命令只进行编译而不进行链接,因此生成的文件不是可执行文件,而是目标文件。如果想要生成可执行文件,可以去掉"-c"选项,即使用命令"gcc hello.c -o hello"。 这就是你的程序明明代码是对的,但是运行的时候报错的原因。
GCC(GNU Compiler Collection)是一套由GNU开发的编译器工具集,用于编译C、C++、Objective-C、Fortran、Ada等多种编程语言。

据此我们可以学习 g c c 其他的选项: \color{red}{据此我们可以学习gcc其他的选项:} 据此我们可以学习gcc其他的选项:

1.2 gcc其他的选项

  1. -c:只编译源文件,生成目标文件,不进行链接。
  2. -o :指定输出文件的名称。
  3. -g:在目标文件中生成调试信息,以便进行调试。
  4. -O:指定优化级别。例如,-O0表示不进行优化,-O1表示基本优化,-O2表示更高级别的优化。
  5. -Wall:显示所有警告信息。
  6. -Werror:将所有警告视为错误。
  7. -I < dir >:指定头文件的搜索路径。
  8. -L < dir >:指定库文件的搜索路径。
  9. -l :链接时使用的库文件。
  10. -D :定义宏。
  11. -E:只进行预处理,生成预处理后的源代码。
  12. -S:只进行编译,生成汇编代码。
  13. -shared:生成共享库文件。
  14. -static:生成静态链接的可执行文件。
  15. -pthread:链接多线程库。

2. 为什么报错“无法执行二进制文件,可执行文件格式错误”

2.1 报错的普遍原因

原因可能有以下几种: \color{red}{原因可能有以下几种:} 原因可能有以下几种:

  • 缺少可执行权限:使用"chmod +x <filename>"命令为文件添加可执行权限。
  • 编译时未加上"-o"选项指定输出文件名:确保在编译时使用了"-o"选项,并指定了输出文件名。
  • 编译时未加上"-c"选项:如果只进行了编译而没有进行链接,生成的目标文件无法直接执行。需要在编译时加上"-c"选项来只生成目标文件,然后进行链接操作生成可执行文件。

一般都是编译的时候带了-c的参数,导致没有进行链接,无法执行,那为什么要带上-c选项呢?

2.2 编译时带上-c的作用

GCC编译器提供了"-c"选项,用于只进行编译而不进行链接。这样做的好处是可以提高编译速度和灵活性。在大型项目中,当我们只对部分源文件进行更改时,只需要重新编译这些源文件,而不需要重新链接整个项目。下面是一个示例代码:

// main.c
#include <stdio.h>int add(int a, int b) {return a + b;
}int main() {int result = add(10, 20);printf("Result: %d\n", result);return 0;
}

假设我们对add函数进行了修改,我们只需要重新编译main.c文件即可:

gcc -c main.c

这样会生成一个名为main.o的目标文件,然后我们可以将其与其他目标文件进行链接,生成最终的可执行文件。

3.main函数带上argc和*argv[]两个参数的作用

在C语言中,main函数是程序的入口函数,它可以接受命令行传递的参数。main函数的参数有两个:argc和*argv[]。

  • argc(argument count) 是一个整数,表示命令行参数的数量。它包括程序本身的名称作为第一个参数。
  • *argv[](argument vector) 是一个指向指针数组的指针,其中每个指针指向一个命令行参数的字符串。argv[0]指向程序的名称,argv[1]指向第一个命令行参数,以此类推。

通过使用这两个参数,我们可以在程序中获取和处理命令行传递的参数。下面是一个示例代码:

// main.c
#include <stdio.h>int main(int argc, char *argv[]) {printf("Number of arguments: %d\n", argc);printf("Program name: %s\n", argv[0]);for (int i = 1; i < argc; i++) {printf("Argument %d: %s\n", i, argv[i]);}return 0;
}

假设我们在命令行中执行以下命令:

./main arg1 arg2 arg3

输出结果将会是:

Number of arguments: 4
Program name: ./main
Argument 1: arg1
Argument 2: arg2
Argument 3: arg3

通过使用argc*argv[],我们可以根据不同的命令行参数执行不同的操作,从而实现程序的灵活性。

结论:

本篇博客详细介绍了GCC编译过程中的"-c"选项和main函数的参数argc*argv[]的作用和理解。通过加上"-c"选项,我们可以只进行编译而不进行链接,提高编译速度和灵活性。同时,我们还了解了main函数参数argc*argv[]的作用,以及如何在程序中获取和处理命令行传递的参数。

相关文章:

【Linux操作系统】编译过程中遇到的问题-为什么加-c?执行文件提示无法执行二进制文件?main函数参数argc和*argv[]的作用和理解?

在使用GCC编译器进行程序开发时&#xff0c;我们经常会遇到一些编译过程中的问题&#xff0c; 比如为什么要加上"-c"选项&#xff0c;以及为什么生成的可执行文件无法执行等问题。 本篇博客将详细介绍这些问题&#xff0c;并给出相应的代码和解释&#xff0c;帮助读者…...

【数据结构与算法——TypeScript】图结构(Graph)

【数据结构与算法——TypeScript】 图结构(Graph) 认识图结构以及特性 什么是图? 在计算机程序设计中&#xff0c;图结构 也是一种非常常见的数据结构。 但是&#xff0c;图论其实是一个非常大的话题 认识一下关于图的一些内容 图的抽象数据类型一些算法实现。 什么是图?…...

C语言字符串拷贝函数详解及示例代码

目录 简介字符串拷贝函数 strcpy字符串拷贝函数 strcpy_s使用示例注意事项结束语 1. 简介 字符串拷贝是C语言中常用的操作之一。当需要将一个字符串复制到另一个字符串数组中时&#xff0c;可以使用字符串拷贝函数来实现。C语言提供了多种字符串拷贝函数&#xff0c;其中最常…...

IntelliJ IDEA热部署:JRebel插件的安装与使用

热部署 概述JRebel 概述 热部署&#xff0c;指修改代码后&#xff0c;无需停止应用程序&#xff0c;即可使修改后的代码生效&#xff0c;其有利于提高开发效率。 热部署方式&#xff1a; 手动热部署&#xff1a;修改代码后&#xff0c;重新编译项目&#xff0c;然后启动应用程…...

iTOP-3568开发板使用OpenCV处理图像-颜色转换

本小节代码在配套资料“iTOP-3568 开发板\03_【iTOP-RK3568 开发板】指南教程 \04_OpenCV 开发配套资料\05”目录下&#xff0c;如下图所示&#xff1a; cv2.cvtColor()函数功能&#xff1a; 将一幅图像从一个色彩空间转换到另一个色彩空间。 函数原型&#xff1a; cv2.cvt…...

Python技巧----解压序列/可迭代对象赋值给多个变量

1 、解压序列赋值给多个变量 我们这里说的不是正常情况的一一赋值比如下面 >>> data = [ ACME, 5, 9, (2012, 12, 1) ] >>> name, shares, price, date = data >>> name ACME...

16.3.2 【Linux】程序的管理

程序之间是可以互相控制的。举例来说&#xff0c;你可以关闭、重新启动服务器软件&#xff0c;服务器软件本身是个程序&#xff0c; 你既然可以让她关闭或启动&#xff0c;当然就是可以控制该程序。 使用kill-l或者是man 7 signal可以查询到有多少个signal。主要的讯号代号与名…...

Linux命令200例:date用于显示和设置系统的日期和时间

&#x1f3c6;作者简介&#xff0c;黑夜开发者&#xff0c;全栈领域新星创作者✌。CSDN专家博主&#xff0c;阿里云社区专家博主&#xff0c;2023年6月csdn上海赛道top4。 &#x1f3c6;数年电商行业从业经验&#xff0c;历任核心研发工程师&#xff0c;项目技术负责人。 &…...

excel入门

上下左右移动 enter:换行&#xff0c;向下移动 shiftenter:向上移动 tab:向右移动 shifttab:向左移动 合并居中操作 开始-》合并居中 CtrlM 内容过长盖过了下一个单元格内容 双击列与列之间线 同时修改多行或者多列宽度或者高度 修改单行高度宽度 选中某一行拉取指定高…...

单模光纤模场强度分布以及高斯近似的MATLAB仿真

已知纤芯半径5um&#xff0c;数值孔径NA 0.1&#xff0c;波长 用波长和数值孔径计算归一化常数V 之前我们在单模光纤特征方程及其MATLAB数值求解中&#xff0c;用线性关系拟合过V和W&#xff0c;这里直接用拟合结果 U用V和W计算 clc clear close alla 5e-6;%纤芯半径 NA …...

Springboot 在 redis 中使用 BloomFilter 布隆过滤器机制

一、导入SpringBoot依赖 在pom.xml文件中&#xff0c;引入Spring Boot和Redis相关依赖 <!-- Google Guava 使用google的guava布隆过滤器实现--><dependency><groupId>com.google.guava</groupId><artifactId>guava</artifactId><vers…...

什么是管理的本质?

管理不是一门硬科学。与&#xff08;通常&#xff09;存在正确答案的化学或代数不同&#xff0c;管理是流动的&#xff0c;主观的&#xff0c;并且对于如何运用其原理存在不同的观点。但究竟什么是管理&#xff1f;大多数学者都有相同定义的变体&#xff0c;包括利用资源来实现…...

02:STM32--EXTI外部中断

目录 一:中断 1:简历 2:AFIO 3:EXTI ​编辑 4:NVIC基本结构 5:使用步骤 二:中断的应用 A:对外式红外传感计数器 1:连接图​编辑 2:函数介绍 3:硬件介绍 4:计数代码 B;旋转编码计数器 1:连接图 2:硬件介绍 3:旋转编码器代码: 一:中断 1:简历 中断&#xff1a;在主程…...

CLickhouse核心特性

目录 CLickhouse核心特性 1 完备的DBMS功能 2 列式存储与数据压缩 3 向量化执行引擎 4 关系模型与SQL查询 5 多样化的表引擎 6 多线程与分布式 7 多主架构 8 在线查询 9 数据分片与分布式查询 Clickhouse适用场景 Clickhouse不适用场景 Clickhouse名称含义 CLickh…...

如何运用小程序技术闭环运营链路?

如何通过线上小程序获取用户线索&#xff0c;提高企业抗风险能力&#xff0c;建立有效的营销数字化系统一直是困扰每一个小程序开发者与运营者的问题。 当我们选择使用小程序设计自己的运营流程时&#xff0c;从「推广」到「转化」&#xff0c;再到最终的「留存」都是运营过程…...

使用chatGPT-4 畅聊量子物理学(二)

Omer 量子力学的主导哲学或模型或解释是什么&#xff1f; ChatGPT 量子力学是一门描述微观世界中粒子行为的物理学理论&#xff0c;但它的解释和哲学观点在学术界存在多种不同的观点和争议。以下是几种主要的哲学观点或解释&#xff1a; 哥本哈根解释&#xff1a;这是最为广泛…...

读《Flask Web开发实战》(狼书)笔记 | 第1、2章

前言 2023-8-11 以前对网站开发萌生了想法&#xff0c;又有些急于求成&#xff0c;在B站照着视频敲了一个基于flask的博客系统。但对于程序的代码难免有些囫囵吞枣&#xff0c;存在许多模糊或不太理解的地方&#xff0c;只会照葫芦画瓢。 而当自己想开发一个什么网站的时&…...

Tomcat+Http+Servlet

文章目录 1.HTTP1.1 请求和响应HTTP请求&#xff1a;请求行请求头请求体HTTP响应&#xff1a;响应行&#xff08;状态行&#xff09;响应头响应体 2. Apache Tomcat2.1 基本使用2.2 IDEA中创建 Maven Web项目2.3 IDEA中使用Tomcat 3. Servlet3.1 Servlet快速入门3.2 Servlet执行…...

Leaflet入门,Leaflet如何实现vue双向绑定数据添加到图片标记物到地图上,动态根据vue数据更新到地图上以及鼠标经过标记物显示提示框

前言 本章使用Leaflet的vue2-leaflet或者vue-leaflet插件方式实现vue数据绑定地图数据,实现地图标记物与vue数据的双向联动更新,以及鼠标经过标记物显示提示框功能。 实现效果演示 vue如何使用Leaflet vue2如何使用:《Leaflet入门,如何使用vue2-leaflet实现vue2双向绑定…...

C++设计模式结构型之代理模式

一、概述 代理模式是一种结构型模式&#xff0c;在很多不同的场合具有广泛的分类和应用。其主要实现的思想是在客户端和真正要访问的对象之间引入一个 代理对象&#xff08;间接层&#xff09;&#xff0c;于是&#xff0c;以往客户端对真正对象的访问现在变成了通过代理对…...

Matlab综合能源系统优化代码:CSP电站与ORC整合建模求解

Matlab综合能源系统优化代码 考虑光热电站&#xff08;CSP电站&#xff09;和ORC的综合能源系统优化的建模求解 程序中包含了新能源发电、ORC循环等&#xff0c;以运行成本、碳排放成本、弃风弃光惩罚成本等为目标函数&#xff0c;基于9节点电网、6节点气网、8节点热网、4节点冷…...

激光技术在多物理场耦合应用中的案例分析:从增材制造到激光打孔与抛光的研究实例集萃

激关相关的模型,视频增材制造.mph 激光焊接.mph run- 激光熔覆-可行.mph 激光烧蚀.mph 激光熔铸.mph 激光打孔飞溅-较好-原始.mph 激光打孔.mph激光打孔飞溅-较好-原始.mph 案例7-激光打孔榕池&#xff08;2&#xff09;.mp4 案例7-激光打孔熔池&#xff08;3&#xff09;.mp4 …...

2026教培行业项目管理系统盘点:8款课程研发协同工具横评

本文将深入对比8款适合教育培训行业的项目管理工具&#xff1a;Worktile、Asana、monday.com、ClickUp、Jira、Confluence、Notion、Smartsheet。文章将围绕教研管理、课程开发协同、文档沉淀、进度追踪、安全合规与部署方式等维度展开分析&#xff0c;帮助教育培训机构判断不同…...

终极指南:5步将S905L3-B电视盒子刷成Armbian服务器

终极指南&#xff1a;5步将S905L3-B电视盒子刷成Armbian服务器 【免费下载链接】amlogic-s9xxx-armbian Supports running Armbian on Amlogic, Allwinner, and Rockchip devices. Support a311d, s922x, s905x3, s905x2, s912, s905d, s905x, s905w, s905, s905l, rk3588, rk3…...

从社交推荐到药物发现:GAT(图注意力网络)在5个工业级场景下的落地实践

从社交推荐到药物发现&#xff1a;GAT在5个工业级场景下的落地实践 当AlphaFold2用图神经网络破解蛋白质折叠难题时&#xff0c;工业界突然意识到&#xff1a;图注意力网络&#xff08;GAT&#xff09;早已不再是学术玩具。在社交平台每天处理数十亿次关系推理的推荐系统里&…...

N_m3u8DL-RE终极指南:跨平台流媒体下载与加密视频处理完全解决方案

N_m3u8DL-RE终极指南&#xff1a;跨平台流媒体下载与加密视频处理完全解决方案 【免费下载链接】N_m3u8DL-RE Cross-Platform, modern and powerful stream downloader for MPD/M3U8/ISM. English/简体中文/繁體中文. 项目地址: https://gitcode.com/GitHub_Trending/nm3/N_…...

救命!这些毕设太好抄了,3000+毕设案例推荐第1027期

271、基于Java的建材租赁智慧管理系统的设计与实现(论文&#xff0b;代码&#xff0b;PPT)建材租赁智慧管理系统主要功能包括&#xff1a;会员操作、客户资料、建材管理、计量单位、建材损坏收费标准、租赁合同、租费标准、租出登记、归还登记、丢赔管理、入库登记、租金计算、…...

火灾现场的无人机防御系统

2026年&#xff0c;XPrize参赛团队将继续角逐&#xff0c;力争防控灾害于萌芽阶段。在外行人眼中&#xff0c;眼前这架Alta X无人机要完成的似乎并不是一项特别复杂的任务。这架翼展超2米的黑色大型四旋翼无人机停在草坪上&#xff0c;起落架两个撑脚之间挂着一个注满水的红色气…...

Agent RAG 底层核心难点

Agent 1. 任务规划与拆解 (Reasoning & Decomposition) 递归深度失控&#xff1a;任务拆得太细导致逻辑迷失&#xff0c;或拆得太粗无法执行。目标漂移 (Goal Drift)&#xff1a;长流程中 Agent 忘记了最初的最终目标。不可逆决策风险&#xff1a;在缺乏“回滚”机制的现实…...

Jenkins页面加载慢到怀疑人生?别急着重启,先检查这个Dark Theme插件

Jenkins页面加载缓慢的深度排查&#xff1a;从Dark Theme插件到系统优化 最近在虚拟机环境中使用Jenkins时&#xff0c;突然发现页面加载速度从原先的1秒内变成了10秒以上。这种变化并非渐进式的&#xff0c;而是某天突然出现的。页面功能一切正常&#xff0c;但每次跳转都需要…...