linux学习之编译-链接
在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学习之编译-链接的更多相关文章
- 从四个问题透析Linux下C++编译&链接
摘要:编译&链接对C&C++程序员既熟悉又陌生,熟悉在于每份代码都要经历编译&链接过程,陌生在于大部分人并不会刻意关注编译&链接的原理.本文通过开发过程中碰到的四个典型 ...
- linux下 GCC编译链接静态库&动态库
静态库 有时候需要把一组代码编译成一个库,这个库在很多项目中都要用到,例如libc就是这样一个库, 我们在不同的程序中都会用到libc中的库函数(例如printf),也会用到libc中的变量(例如以后 ...
- Linux 64位编译\链接32位程序
测试机器:Ubuntu14.04 64位 gcc编译32位程序,添加参数-m32: $ gcc -c -fno-builtin -m32 TinyHelloWorld.c ld链接32位代码,添加参数 ...
- Linux学习---GCC编译常见错误
预处理错误: No such file or directory 出错原因:①包含错误:eg #include <abc.h> //abc.h为用户自行编写文件 解决方法:⑴应改为#in ...
- Linux学习---GCC编译过程
(一)GCC编译过程 预处理 cpp -o a.i a.c //生成预处理文件 等同于[gcc -E] //预处理为将宏定义(#define)等进行替换. 编译 /user/lib/gcc/i ...
- Linux学习笔记 -- 硬链接与软连接(转)
原文地址: http://www.cnblogs.com/itech/archive/2009/04/10/1433052.html Linux链接概念 Linux链接分两种,一种被称为硬链接(Har ...
- Linux学习-核心编译的前处理与核心功能选择
硬件环境检视与核心功能要求 根据自己的需求来确定编译的选项 保持干净原始码: make mrproper 我们还得要处理一下核心原始码底下的残留文件才行!假设我们是第一次 编译, 但是我们不清楚到底下 ...
- Linux学习之编译运行.c(C语言)文件
在Linux命令行界面下,创建文件hello.c,进入vim编辑器,编辑一个简单的C语言文件 分解C语言文件执行过程,要经过预编译.编译.汇编.连接四个步骤后才能执行, 预编译:gcc -E hell ...
- Linux学习之编译安装apache
疯狂吐槽腾某云..编译安装apache折腾了一下午..还是我不太熟练. 首先要先准备好安装apache的三个依赖包以及apache包.(一定要准备好!!折腾了一下午的小白握拳!!) -rw-r--r- ...
随机推荐
- yum安装logstash 不生效
问题描述 根据logstash的配置方法写了一个配置文件,并放入/etc/logstash/conf.d/目录下,然后我们运行logstash # service logstash start Log ...
- 1058 - Parallelogram Counting 计算几何
1058 - Parallelogram Counting There are n distinct points in the plane, given by their integer coord ...
- 在Kali linux下使用docker配置sqli-labs(国内源的配置和系统软件更新)
本篇blog导航: ~前言 ~第一步:在安装好的kali配置国内源 ~第二步:安装docker ~第三步:docker下安装sqli-labs ~写在最后. 前言: 最近闲来无事,在闯关sqli-la ...
- 解释为什么wait()和notify(), notifyAll()要放在同步块中
首先,wait()是释放锁的,因此wait()之前要先获得锁,而锁在同步块开始的时候获得,结束时释放,即同步块内为持有锁的阶段. 那为什么要设计同步块呢?或者说没有同步块会怎样呢?
- SQL Server 2019 表无法修改问题
SQL Server 2019 表无法修改问题 问题描述: 解决方法: 1.在菜单栏中,点击工具->选项,示例: 2.在选项中单击设计器->表设计器和数据库设计器->取消勾选阻止保存 ...
- centos7使用fdisk:创建和维护MBR分区表
1.在VMware选择要添加硬盘的虚拟机,添加一块硬盘. 这样就有两块硬盘 2.重启虚拟机. cd /dev #dev是设备目录,下面有很多很多设备,其中就包含硬盘 ll grep | sd #过滤s ...
- O2O外卖玩众包 开放平台难解标准之痛
开放平台难解标准之痛" title="O2O外卖玩众包 开放平台难解标准之痛"> 有一种怪现象一直是国内互联网企业摆脱不了的附骨之疽--不管规模大小,总是削尖了脑 ...
- .NET CORE(C#) WPF 方便的实现用户控件切换(祝大家新年快乐)
微信公众号:Dotnet9,网站:Dotnet9,问题或建议:请网站留言, 如果对您有所帮助:欢迎赞赏. .NET CORE(C#) WPF 方便的实现用户控件切换(祝大家新年快乐) 快到2020年了 ...
- vue2.0嵌套组件之间的通信($refs,props,$emit)
vue的一大特色就是组件化,所以组件之间的数据交互是非常重要,而我们经常使用组件之间的通信的方法有:props,$refs和emit. 初识组件之间的通信的属性和方法 props的使用 子组件使用父组 ...
- POJ-2299 Ultra-QuickSort(用树状数组求逆序对数)
题目链接 ac代码 #include<iostream> #include<cstdio> #include<cstring> #include<algori ...