【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[]的作用,以及如何在程序中获取和处理命令行传递的参数。

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

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

相关文章

Python web实战之Django的AJAX支持详解

关键词&#xff1a;Web开发、Django、AJAX、前端交互、动态网页 今天和大家分享Django的AJAX支持。AJAX可实现在网页上动态加载内容、无刷新更新数据的需求。 1. AJAX简介 AJAX&#xff08;Asynchronous JavaScript and XML&#xff09;是一种在网页上实现异步通信的技术。通过…

20230814让惠普(HP)锐14 新AMD锐龙电脑不联网进WIN11进系统

20230814让惠普(HP)锐14 新AMD锐龙电脑不联网进WIN11进系统 2023/8/14 17:19 win11系统无法跳过联网 https://www.xpwin7.com/jiaocheng/28499.html Win11开机联网跳过不了怎么办&#xff1f;Win11开机联网跳过不了解决方法 Win11开机联网跳过不了怎么办&#xff1f;Win11开机…

8.14 ARM

1.练习一 .text 文本段 .global _start 声明一个_start函数入口 _start: _start标签&#xff0c;相当于C语言中函数mov r0,#0x2mov r1,#0x3cmp r0,r1beq stopsubhi r0,r0,r1subcc r1,r1,r0stop: stop标签&#xff0c;相当于C语言中函数b stop 跳转到stop标签下的第一条…

HCIP-OpenStack

1、OpenStack概述 OpenStack是一种云操作系统&#xff0c;OpenStack是虚拟机、裸金属和容器的云基础架构。可控制整个数据中心的大型计算、存储和网络资源池&#xff0c;所有资源都通过API或Web界面进行管理。 为什么称OpenStack是云操作系统&#xff1f; 云一般指云计算&…

【MySQL--->数据类型】

文章目录 [TOC](文章目录) 一、数据类型分类二、整型类型三、bit(位)类型四、float类型五、decimal类型六、char和varchar类型1.char类型2.varchar3.char与varchar的区别 七、日期与时间类型八、enum和set 一、数据类型分类 二、整型类型 数值类型有数据存储上限,而且每个类型都…

C语言暑假刷题冲刺篇——day1

目录 一、选择题 二、编程题 &#x1f388;个人主页&#xff1a;库库的里昂 &#x1f390;CSDN新晋作者 &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏✨收录专栏&#xff1a;C语言每日一练 ✨其他专栏&#xff1a;代码小游戏C语言初阶&#x1f91d;希望作者的文章能对你…

【计算机视觉|生成对抗】改进的生成对抗网络(GANs)训练技术

本系列博文为深度学习/计算机视觉论文笔记&#xff0c;转载请注明出处 标题&#xff1a;Improved Techniques for Training GANs 链接&#xff1a;[1606.03498v1] Improved Techniques for Training GANs (arxiv.org) 摘要 本文介绍了一系列应用于生成对抗网络&#xff08;G…

数据可视化工具的三大类报表制作流程分享

电脑&#xff08;pc&#xff09;、移动、大屏三大类型的BI数据可视化报表制作步骤基本相同&#xff0c;差别就在于尺寸调整和具体的报表布局。这对于采用点击、拖拉拽方式来制作报表的奥威BI数据可视化工具来说就显得特别简单。接下来&#xff0c;我们就一起看看不这三大类型的…

ES中倒排索引机制

在ES的倒排索引机制中有四个重要的名词&#xff1a;Term、Term Dictionary、Term Index、Posting List。 Term&#xff08;词条&#xff09;&#xff1a;词条是索引里面最小的存储和查询单元。一段文本经过分析器分析以后就会输出一串词条。一般来说英文语境中词条是一个单词&a…

wps设置一键标题字体和大小

参考 wps设置一键标题字体和大小&#xff1a;https://www.kafan.cn/A/7v5le1op3g.html 统一一键设置

数据结构:力扣刷题

题一&#xff1a;删除有序数组中的重复项 给你一个 升序排列 的数组 nums &#xff0c;请你 原地 删除重复出现的元素&#xff0c;使每个元素 只出现一次 &#xff0c;返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 nums 中唯一元素的个数。 考虑 nums 的…

Intel汇编和ATT汇编的区别?

一、前缀不同 在 Intel 语法中&#xff0c;没有寄存器前缀或立即前缀。 然而&#xff0c;在 AT&T 中&#xff0c;寄存器的前缀是“%”&#xff0c;而 immed 的前缀是“$”。 Intel 语法十六进制或二进制即时数据分别带有“h”和“b”后缀。 此外&#xff0c;如果第一个十六…

14k字综述视觉大模型

目录 0.导读1.背景介绍1.1基础架构1.2目标函数1.2.1对比式学习1.2.2生成式学习1.3预训练1.3.1预训练数据集1.3.2微调1.3.3提示工程2.基于文本提示的基础模型2.1基于对比学习的方法2.1.1基于通用模型的对比方法2.1.2基于视觉定位基础模型的方法2.2基于生成式的方法2.3基于对比学…

安全加密框架图——Oracle安全开发者

Oracle安全开发者 ACLs 设计 ACLs&#xff08;访问控制列表&#xff09;时&#xff0c;可以根据以下思路进行设计&#xff1a; 所有者文件权限&#xff1a;确定文件的所有者能够对文件执行哪些操作&#xff0c;如读取、写入、执行等。这可以根据文件的性质和拥有者的职责来决…

Destination Host Unreachable

背景&#xff1a;物理机的IP地址是192.168.31.189&#xff0c;虚拟机的IP地址是192.168.194.130 物理机ping得通虚拟机 虚拟机ping得通外网 可是虚拟机ping不通物理机 1、报错信息 Destination Host Unreachable 2、原因 用route -n命令查看路由表发现192.168.194.0没有走网…

opencv+ffmpeg+QOpenGLWidget开发的音视频播放器demo

前言 本篇文档的demo包含了 1.使用OpenCV对图像进行处理&#xff0c;对图像进行置灰&#xff0c;旋转&#xff0c;抠图&#xff0c;高斯模糊&#xff0c;中值滤波&#xff0c;部分区域清除置黑&#xff0c;背景移除&#xff0c;边缘检测等操作&#xff1b;2.单纯使用opencv播放…

基于深度信念神经网络+长短期神经网络的降雨量预测,基于dbn-lstm的降雨量预测,dbn原理,lstm原理

目录 背影 DBN神经网络的原理 DBN神经网络的定义 受限玻尔兹曼机(RBM) LSTM原理 DBN-LSTM的降雨量预测 基本结构 主要参数 数据 MATALB代码 结果图 展望 背影 DBN是一种深度学习神经网络,拥有提取特征,非监督学习的能力,通过dbn进行无监督学习提取特征,然后长短期神经…

Android Studio实现图形验证码

源代码 源代码MainActivity 效果图32行需要修改&#xff0c;不修改会报错&#xff1a;需要常量表达式&#xff0c;我的代码已修改 点击后 MainActivity import static com.example.graphicverificationcode.RxCaptcha.TYPE.NUMBER;import android.annotation.SuppressLint; …

c++ 学习系列 -- 智能指针

一 为什么引入智能指针&#xff1f;解决了什么问题&#xff1f; C 程序设计中使用堆内存是非常频繁的操作&#xff0c;堆内存的申请和释放都由程序员自己管理。但使用普通指针&#xff0c;容易造成内存泄露&#xff08;忘记释放&#xff09;、二次释放、程序发生异常时内存泄…

Failed to execute goal org.apache.maven.plugins

原因&#xff1a; 这个文件D:\java\maven\com\ruoyi\pg-student\maven-metadata-local.xml出了问题 解决&#xff1a; 最简单的直接删除D:\java\maven\com\ruoyi\pg-student\maven-metadata-local.xml重新打包 或者把D:\java\maven\com\ruoyi\pg-student这个目录下所有文件…