linux下进行c++开发,需要熟悉相关编译器的编译、链接命令。这边主要以实例讲解,如何在linux中,进行c++程序简单的编译链接运行。

一、单文件编译链接

这里先从最简单的单个文件编译链接为例。在桌面下新建一个名字为:helloworld.cpp

文件内容:

#include <iostream> int main(int argc,char *argv[]) {std::cout << "hello, world" << std::endl;return(0); }</iostream>

直接cd文件所在的目录,然后输入命令:g++ helloworld.cpp         将生成可执行文件,名字为a.out的直接生成可执行文件。如果要指定输出的可执行文件名,那么命令为:g++ helloworld.cpp -o file_name      此时将生成文件名为:file_name.out 的可执行文件 ,即 可选项  -o  用于指定文件生成的名字。在大多数系统中GCC安装是会安装一个名为c++的程序,也就是说此时命令:c++ 与g++是相同的,因此也可以使用命令:c++ helloworld.cpp -o file_name    编译上面的文件。.h文件不需要指定编译,因为程序编译中,会自动根据#include 进行搜索当前目录、系统目录。

总结:如果只有一个.cpp文件的,且里面包含main函数,那么直接用:g++命令,将直接生成可执行文件。

二、多文件链接编译链接

多文件的编译链接需要包含两个步骤:1、编译,用可选命令 -c 进行编译cpp文件,生成.o文件                 2、链接,根据步骤1生成的.o文件生成可执行文件 。看一下以下实例:

建立头文件名:speak.h   内容如下:

#include <iostream> class Speak {public:void sayHello(const char *); };</iostream>

建立源文件:speak.cpp ,内容如下:

#include "speak.h" void Speak::sayHello(const char *str) {std::cout << "Hello " << str << "\n"; }

主函数文件: hellospeak.cpp 调用speak类
                                                                                                                                                                                                   /* hellospeak.cpp */ #include "speak.h" int main(int argc,char *argv[]) {Speak speak;speak.sayHello("world");return(0); }

现在有两个.cpp文件,其中一个包含有main函数,那么就不能一步直接生成可执行文件,这时要分为两个步骤才能生成可执行文件。采用-c命令,先进行编译,生成.o文件,然后再生成可执行文件,命令如下:

g++ -c  filename1.cpp  main.cpp

g++ filename1.o main.o -o out_filename

或者采用如下两个命令:

g++ -c  filename1.cpp

g++ filename1.o main.cpp -o out_filename

三、makefile文件编写

以上2个文件编译链接,用简单的命令就可以实现,然而我们遇到的项目,往往是几十个,甚至几百几千个文件的,那么这个时候通过简单的命令编译链接的方法,就会相当复杂,这个时候我们就要用到make了。

makefile文件编写规则:

target1  : prerequisites1

command1

target2 : prerequisites2

command

……

目标:依赖

执行指令 ...

(1)target目标,我们要生成的文件。

(2) prerequisites依赖,就是要生成那个target所需要的文件或是目标。

(3) command命令 ,相关的生成target所需要的编译链接命令。(g++)

make执行的时候,可以根据文件是否更新,进行编译链接。这个就像vs里面,当我们有一个文件被改动的时候,这个文件及其相关的链接文件将被重新编译链接。如果没有更新,则vs不会对这个文件进行重新编译,这样可以减少每次都重复编译,提高效率。makefile这是一个文件的依赖关系,也就是说,target这一个或多个的目标文件依赖于prerequisites中的文件,其生成规则定义在command中。说白一点就是说,prerequisites中如果有一个以上的文件比target文件要新的话,command所定义的命令就会被执行(command一定要以Tab键开始,否者编译器无法识别command),减少重复编译,提高了其软件工程管理效率。

为了简便起见,我们这边继续以上面的例子为试验,进行学习makefile文件的编写。

新建文件名:makefile ,文件内容:

outfile : speak.o helloworld.o g++ speak.o helloworld.o -o outfile speak.o : speak.cpp speak.h g++ -c speak.cpp -o speak.o helloworld.o : helloworld.cpp speak.h g++ -c helloworld.cpp -o helloworld.o

然后在终端直接输出命令:make     即可完成编译链接,同时将生成可执行文件名:outfile

编写注意事项:

1、makefile文件中,命令的换行要用  \   ,这个与matlab用...换行有点类似 \

否则会出现如下错误:

正确的写法应该是这样的:

bj=speak.o \ helloworld.o outfile:$(obj) g++ $(obj) \ -o outfile helloworld.o speak.o:speak.h

2、makefile的命令g++前面一定要是tab按键,其它的都不行 即便是空格也会报错

上面简简单单的两个文件编译,就需要些那么多代码,是不是感觉很不爽,接着我们讲一下如何简化:

1、定义变量,以此简化命令,在以上的makefile文件中我们知道,“speak.o helloworld.o”这一段被重复使用了两次,因此以上的makefile我们也可以这样写:

obj=speak.o helloworld.o outfile : $(obj) g++ $(obj) -o outfile speak.o : speak.cpp speak.h g++ -c speak.cpp -o speak.o helloworld.o : helloworld.cpp speak.h g++ -c helloworld.cpp -o helloworld.o

我们定义了变量名obj,使其值为“speak.o helloworld.o”  ,然后在后面,只要有 “speak.o helloworld.o”,我们就用变量$(obj)替换掉。这样就做了第一步,makefile文件的简化,在终端输入make,依然可以生成同样的可执行文件。

2、使用自动推导,简化命令。只要make看到一个[.o]文件,它就会自动的把[.c]文件加在依赖关系中,如果make找到一个whatever.o,那么 whatever.cpp,就会默认为whatever.o的依赖文件。并且 g++ -c whatever.cpp也会被自动推导出来,那么以上的命令我们又可以继续简化为:

obj=speak.o helloworld.o outfile : $(obj) g++ $(obj) -o outfile speak.o : speak.h helloworld.o : speak.h

也就是说如果目标文件是生成.o文件,那么我们可以不必包含 编译命令,及其相应的源文件,只留下其编译所需要的头文件。

3、因为helloworld.o speak.o两个文件都包含同样的一个头文件,当然你也可以这样写:

obj=speak.o helloworld.o outfile : $(obj) g++ $(obj) -o outfile helloworld.o speak.o : speak.h

不过这种写法不推荐,很容易混乱掉。

初级部分先讲到这里,后面我会继续讲比较深入的makefile文件编写。本文地址:http://blog.csdn.net/hjimce/article/details/45567689    作者:hjimce     联系qq:1393852684   更多资源请关注我的博客:http://blog.csdn.net/hjimce                  原创文章,版权所有,转载请保留本行信息

Cmake学习:http://hahack.com/codes/cmake/

基础知识(三)makefile文件编写初级篇相关推荐

  1. ArcGIS基础知识之shape文件的构成

    ArcGIS基础知识之shape文件的构成 一般来说Shape文件主要由3个文件构成: 主文件.索引文件.数据文件.每个shapefile,都至少有这三个文件组成,其中: .shp 存储的是几何要素的 ...

  2. SYNOPSYS VCS Makefile文件编写与研究

    SYNOPSYS VCS Makefile文件编写与研究 这个Makefile是synopsys提供的模板,看上去非常好用,你只要按部就班提供实际项目的参数就可以了.我们来看这个文件的头部说明: ma ...

  3. 01_Linux系统管理_基础知识_高级文件系统管理_磁盘配额(quota)

    环境 虚拟机:VMware-10.0.7 build-2844087 Linux系统:CentOS 6.8 远程工具:Xshell 6 (Build 0197) 01_Linux系统管理_基础知识_高 ...

  4. (六)JS基础知识三(走进作用域和闭包)【三座大山之二,不会闭包,基本不会通过】

    JS基础知识三(作用域和闭包) 提问 作用域 自由变量 闭包 this 提问 this的不同应用场景,如何取值 手写bind函数 实际开发中闭包的应用场景,举例说明 创建10个a标签,点击的时候弹出对 ...

  5. linux 筛选文件,「Linux基础知识」grep文件内容筛选命令的使用

    原标题:「Linux基础知识」grep文件内容筛选命令的使用 grep命令用于从文档中抓取显示包含指定字符的行,grep命令的使用格式如下: grep [选项] 匹配模式 文件1 文件2 ...... ...

  6. CSS基础知识---三种选择器

    CSS基础知识---三种选择器 选择器 标签选择器 id选择器 class选择器 全部代码 选择器 标签选择器 id选择器 class选择器 标签选择器 选择器优先级:id>class>标 ...

  7. makefile文件编写_九图记住Makefile

    本文首次编辑时间2020.07.20 最后编辑时间2020.08.03 欢迎转载,转载请附上原文链接 参考: GNU make说明文档:https://www.gnu.org/software/mak ...

  8. 三校生计算机word基础知识,三校生计算机第一次月考计算机基础、word.doc

    三校生计算机第一次月考计算机基础.word 云南省高等职业技术教育招生考试试题 计算机基础.word基础知识(9月考试卷) 姓名:_ __ ____ 得分:____ ___ 一.单项选择题(在每小题给 ...

  9. 计算机基础知识教材分析,计算机教学计划四篇

    计算机教学计划四篇 时间过得太快,让人猝不及防,我们的工作又将在忙碌中充实着,在喜悦中收获着,是时候抽出时间写写计划了.相信大家又在为写计划犯愁了?以下是小编整理的计算机教学计划4篇,仅供参考,大家一 ...

最新文章

  1. mysql数据去重语句_数据库 mysql 语句
  2. Django博客系统(文章分类模型)
  3. Python实现前端AES加密方式分析,***密码学必备!
  4. python安装包-安装 Python 模块
  5. 震惊!原来这才是Kafka的“真面目”!
  6. HDU 5214 Movie【贪心】
  7. java内存模型浅析_浅析java内存模型
  8. json_encode 处理中文乱码
  9. ant design vue中通知提醒框Notification的使用
  10. sklearn tfidf求余弦相似度_【基础算法 】文本相似度计算
  11. jQuery源码解析(1)—— jq基础、data缓存系统
  12. mysql库迁移_MySql数据库 指定库迁移
  13. html单选按钮选中后取消选中,jquery实现单选按钮选中与取消选中
  14. 造轮子:前端模板引擎
  15. express在本地起一个简单服务器可能会用到的(本文用的uniapp做例子)
  16. 计算机公开课打字游戏,H5公开课:古堡密卷--打字通关游戏设计及开发
  17. 元宇宙里“倒腾狗”,预示“下一代互联网”要来了?
  18. c语言二级选择题APP,C语言二级考试题库
  19. win10快捷键及浏览器快捷键
  20. 【HUSTOJ】1054: 字符图形10-字母三角

热门文章

  1. vue radio双向绑定_Vue 双向绑定
  2. 【tool】企业级开源分布式文件服务器搭建(FastDFS)
  3. Linux 新加一块硬盘,添加到已有逻辑卷扩容
  4. python越学越糊涂_你越努力,编程水平越差!这样学 Python ,更容易成为高手!...
  5. 怎么让电脑速度变快_小科普 | 免费的路由器!用你的电脑开5G热点!
  6. couchbase java 手册_couchbase的使用 java
  7. STM32 HAL库 UART 串口读写功能笔记
  8. 迁移桌面程序到MS Store(8)——通过APPX下载Win32Component
  9. English trip M1 - PC9 Where am I Teacher:Jade
  10. 算法测试及对比度进一步增强