在Windows下使用习惯了IDE,导致我们对程序的编译链接没有一个清晰的认识,甚至混淆了编辑器和编译器的概念。在学习Linux时,这些问题就暴露出来了。

实际上,我们应该严格区分一个程序从产生到执行的整个过程:写代码->编译->链接->可执行程序。

1 写程序

严格来说,无论我们是否在IDE中写程序,我们都相当于在一个记事本上写了一个.txt文件。在进行编译之前,我们写的程序就是一堆文字而已,并没有什么逻辑关系而言,这一点很重要!!!

即使在Windows中,在VS中写c++程序,所提供的写程序界面无非是一个文本编辑器而已,也就是如果我们有合适的编译,链接工具,我们甚至不需要IDE,只需要一个 记事本 即可!!!在Linux下,这个概念就凸显出来了,无论是vim还是vscode还是自带的记事本 都没有本质的区别,只不过是一个文本编辑器而已。

2 编译-链接

我们写一个程序的本意并不是写一个只读只写文本,而是写一个具有某种功能的可执行的文件。这就需要我们的编译和链接了,至于编译和链接到底是干什么的,在次不再赘述,在其他文章中有说明。我们只想说明,在Linux如何编译链接:

使用g++编译链接c++文件,使用gcc文件编译连接c文件。

首先,需要安装 g++或者gcc,方法网上有,在此说明,如何查看自己是否安装了g++呢, 使用命令:whereis g++ 可以查看g++安装的位置,自然可以查看是否安装了,或者使用g++  --version命令同样可以查看。

那么具体的过程是什么样的呢?下面举例说明我们写程序到编译连接的过程,

比如我们在桌面写了一个helloword.cpp文件(假如就是用记事本写的),注意只是给它了一个后缀名,这只是一个普通的文件,并不是c++程序,此时,我们需要对其编译链接,生成可执行的文件。那么首先对于Linux来说,可执行文件的后缀是.out。(因为我们都知道在Windows下可执行文件的名称是exe)。

那么如何把一个helloword.cpp文本文件变成 helloword.out文件?打开终端,输入以下不同的命令,可以得到不同的结果

g++ –c Hello.cc  编译文件,生成目标文件 Hello.o

g++ Hello.o –o abc  连接 并重命名为可执行文件 abc

g++ Hello.cc    编译连接一起,生成a.out

g++ Hello.cc –o hello 生成a.out并命名为hello
可以采用  ./filename的方式执行上述生成的.out文件

上述是在桌面环境,且只有一个cpp文件,但问题在于,我们使用桌面文本编译器,无法高效编写程序(比如提示词,缩进,等等..),这个时候不得不使用其他高级的编辑工具(注意本质仍然是文本编辑工具,并不是IDE,如vim和vscode都是文本编辑器),这些编辑工具仍然不具备编译链接的功能,但是可以提高写代码的效率,这个时候我们会使用vim或者vscode这样的工具,那么使用这这些工具时,如何调用g++进行程序的编译呢,以及当编写大型工程时,如何提高编译效率呢?(先编译谁后编译谁?)

linux学习之编译-链接的更多相关文章

  1. 从四个问题透析Linux下C++编译&链接

    摘要:编译&链接对C&C++程序员既熟悉又陌生,熟悉在于每份代码都要经历编译&链接过程,陌生在于大部分人并不会刻意关注编译&链接的原理.本文通过开发过程中碰到的四个典型 ...

  2. linux下 GCC编译链接静态库&动态库

    静态库 有时候需要把一组代码编译成一个库,这个库在很多项目中都要用到,例如libc就是这样一个库, 我们在不同的程序中都会用到libc中的库函数(例如printf),也会用到libc中的变量(例如以后 ...

  3. Linux 64位编译\链接32位程序

    测试机器:Ubuntu14.04 64位 gcc编译32位程序,添加参数-m32: $ gcc -c -fno-builtin -m32 TinyHelloWorld.c ld链接32位代码,添加参数 ...

  4. Linux学习---GCC编译常见错误

    预处理错误: No such file or directory 出错原因:①包含错误:eg  #include <abc.h> //abc.h为用户自行编写文件 解决方法:⑴应改为#in ...

  5. Linux学习---GCC编译过程

    (一)GCC编译过程 预处理 cpp -o a.i a.c     //生成预处理文件 等同于[gcc -E] //预处理为将宏定义(#define)等进行替换. 编译 /user/lib/gcc/i ...

  6. Linux学习笔记 -- 硬链接与软连接(转)

    原文地址: http://www.cnblogs.com/itech/archive/2009/04/10/1433052.html Linux链接概念 Linux链接分两种,一种被称为硬链接(Har ...

  7. Linux学习-核心编译的前处理与核心功能选择

    硬件环境检视与核心功能要求 根据自己的需求来确定编译的选项 保持干净原始码: make mrproper 我们还得要处理一下核心原始码底下的残留文件才行!假设我们是第一次 编译, 但是我们不清楚到底下 ...

  8. Linux学习之编译运行.c(C语言)文件

    在Linux命令行界面下,创建文件hello.c,进入vim编辑器,编辑一个简单的C语言文件 分解C语言文件执行过程,要经过预编译.编译.汇编.连接四个步骤后才能执行, 预编译:gcc -E hell ...

  9. Linux学习之编译安装apache

    疯狂吐槽腾某云..编译安装apache折腾了一下午..还是我不太熟练. 首先要先准备好安装apache的三个依赖包以及apache包.(一定要准备好!!折腾了一下午的小白握拳!!) -rw-r--r- ...

随机推荐

  1. linux 下生成随机密码生成器

    [root@localhost ~]# yum -y install pwgen [root@localhost ~]# pwgen -ncCyB1 8 1 kei%b3Xa [root@localh ...

  2. 解决关闭SSH进程CobaltStrike自动关闭

    解决关闭SSH进程CobaltStrike自动关闭 0x0 那么为什么ssh一关闭,程序就不再运行了? 答:元凶:SIGHUP 信号 让我们来看看为什么关掉窗口/断开连接会使得正在运行的程序死掉. 在 ...

  3. echarts 的 formatter用法

    前言:formatter格式化方法.使用formatter调用自定义的数据,把内容通过处理让变成我们想要的样子. 比如,echarts数据显示是这样的(bug:部分内容被隐藏掉了,显示太长,不美观) ...

  4. 传智播客C++视频学习笔记(5)

    #include <iostream> using namespace std; void swapInt(int& a, int& b) { int temp = a; ...

  5. .NET Core 3 Web Api Cors fetch 一直 307 Temporary Redirect

    .NET Core 3 Web Api Cors fetch 一直 307 Temporary Redirect 继上一篇 .net core 3 web api jwt 一直 401 为添加JWT- ...

  6. 发布到IIS的php网站,所有的页面打开都是空白,目录权限问题,已解决

    查了下,html可以打开,百度下原因,是网站目录没有写权限所致,修改下权限正常显示

  7. Javaweb项目中修改表单时数据回显方法

    1.前言 先来说下什么是数据回显,比如我要修改我的个人信息,点击修改按钮后进入修改界面,在这个界面中直接将原来的信息显示在表单中,而不是空表单,这就是数据回显 2.思路 当点击修改的时候,从数据库中查 ...

  8. 【python基础语法】第6天作业练习题

    ''' 二.作业(每一道题封装成一个函数) 1.输出99乘法表,结果如下:(提示嵌套for循环,格式化输出) 2.有1 2 3 4 这四个数字,设计程序计算能组成多少个互不相同且无重复数字的3位数?分 ...

  9. 嵌入式设备sqlite库移植和使用

    1]官网下载sqlite-autoconf-3300100.tar.gz,网址https://www.sqlite.org/download.html,2]解压:tar zxvf sqlite-aut ...

  10. 全栈之路-小程序API-SpringBoot项目中参数校验机制与LomBok工具集使用

    参数校验机制在web开发中是非常重要的,每当看到现在所在公司的校验代码,我都有头疼,每一个接口都是重新写参数的校验,有些复杂的接口,参数的校验甚至占了整个接口代码量的挺大一部分的,看着我都有些头疼,我 ...