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- ...
随机推荐
- PHP 安装扩展步骤
一般来说php安装扩展需要几下几个步骤 1.下载扩展包 比如 pdo_mysql.tar.gz (如果不想下载,可以到php安装目录,(类似php-5.3.3/ext/)的ext文件中找 ...
- Nexus 安装运维手册
1. Nexus 安装与配置 1.1 下载Nexus 登录https://www.sonatype.com/download-oss-sonatype,下载最新的Nexus版本. 我这里使用的是nex ...
- Keras深度学习框架之损失函数
一.损失函数的使用 损失函数[也称目标函数或优化评分函数]是编译模型时所需的两个参数之一. model.compile(loss='mean_squared_error', optimizer='sg ...
- js , forEach 用法
person.forEach((item,index) => { console.log( item.id ); if( id == item.id ){ item.is_selected = ...
- C#代码实现-冒泡排序
冒泡排序原理:(升序)通过当前位置数和后一个位置数进行比较 如果当前数比后一个数大 则交换位置, 完成后 比较基数的位置变成下一个数.直到数组末尾,当程序运行完第一遍 最大的数已经排序到最后一个位置了 ...
- Python3标准库:functools管理函数的工具
1. functools管理函数的工具 functools模块提供了一些工具来调整或扩展函数和其他callable对象,从而不必完全重写. 1.1 修饰符 functools模块提供的主要工具就是pa ...
- mybatis 测试输出SQL语句到控制台配置
1: mybatis-config.xml <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE ...
- asp.net abp模块化开发之通用树2:设计思路及源码解析
一.前言 上一篇大概说了下abp通用树形模块如何使用,本篇主要分析下设计思路. 日常开发中会用到很多树状结构的数据,比如:产品的多级分类.省市区县,大多数系统也会用到类似“通用字典/数据字典”的功能, ...
- C#设计模式学习笔记:(8)装饰模式
本笔记摘抄自:https://www.cnblogs.com/PatrickLiu/p/7723225.html,记录一下学习过程以备后续查用. 一.引言 今天我们要讲结构型设计模式的第三个模式--装 ...
- Android应用第一次启动时的欢迎界面制作
原理是这样,我们在SharedPreferences中存储一个int型数据,用来代表第几次登录,每次启动时都读取出来判断是不是第一次启动,然后依次判断是否要显示欢迎界面, 具体实现如下: 设置一个欢迎 ...