一、C/C++的编辑编译与链接

敲代码的过程就是编辑过程,在编辑完成程序后需要经过编译和链接两个步骤才可以把程序变成我们所需要的可执行程序。

编译过程(包括预处理、编译,汇编(test.s到test.o)三个过程)最终在linux系统上生成.o文件,在windows系统上生成.obj文件。这个过程会将.cpp文件中包含的头文件添加到.cpp文件中,意思大概就是用头文件里面的具体内容替代include这句话,但是不需要具体的实现内容。

形如:include<>,是在系统指定目录中查找头文件,在linux系统中指定的默认目录包括:usr/include;usr/local/include;/usr/aarch64-linux-gnu/include

形如:include””,是在引号里面的目录中查找头文件,如果寻找不到的话在去默认目录中查询。

该过程的实现:例如有三个文件,main.cpp,test1.cpp,test1.hpp在同一个文件夹下,具体内容如下:

上面三个文档位于同一个文件夹下面,则使用g++的编译方式为:

g++ -c main.cpp
g++ -c test1.cpp

上面看似没有用到test1.hpp,如果把test1.hpp去除,则编译部分无法完成,而去除test1.cpp对main的编译没有没有影响。按照上面所说,也可以把test1.hpp移动到系统默认文件中。

3. 链接就是把目标文件、目标文件所需要的库文件,其他目标代码(指所依赖的其他.o文件—可以是编译中生成的,不是源文件)等进行组织,生成可执行文件的过程,在linux系统上生成没有后缀的可执行文件,在windows系统中生成.exe文件。

* 该过程的实现:在2中生成了main.o和test1.o两个目标文件,这里需要进行链接,按照定义,就是主要的目标文件(mian.o)和其他目标文件(test1.o)进行链接,如果main.o用到的库的文件,这里也会自动链接到库中。

* 使用g++的链接方式为:

g++ main.o test1.o -o main

或者是

g++ -o main main.o test1.o

注意:.o后面跟着的是生成的文件名称。

二、静态库和动态库

前面说过链接的过程需要使用到库,这里的库其实就是函数库,linux系统下的静态函数库的后缀是.a,动态库是.so。静态库和动态库的区别是:

* 静态库由一系列的.o文件组成,在链接过程中,这些.o文件与主要的目标文件一起生成目标文件,生成之后就不需要这些.o文件了;

* 动态库在链接过程中并没有用到具体函数使用,它是在程序的运行过程中才动态的调用。正如windows系统中,我们看到需要的.exe文件夹中,包含了各式各样的.dll文件(windows下的动态库),当然所需要的.dll文件也有一部分在系统的默认路径下。

三、g++的几个常用命令

编译过程的预处理、编译、汇编的步骤也可以通过g++的命令实现,但是基本无用。

编译和链接的两个命令如一中所使用

g++也可以直接生成可执行程序,一中的编译链接可以通过如下命令一步完成:

g++ main.cpp test1.cpp -o main

也会常常遇到头文件和库文件不在指定目录和当前目录下的情况:这种情况可以通过以下命令指定所需要的目录路径来实现:

g++ main.cpp -o main -I -L -l

-I表示include,main.cpp包含的头文件地址,-L表示lib库表示所需要的库的地址,-l(小写的L)表示lib,为具体的-L下路径中的所需要的库的名称。

四、项目必备的makefile文件

在三中,如果工程项目包含了太多的头文件和库,会导致g++编译链接命令写的很长,如果各种依赖关系十分复杂,则g++命令会显得十分繁琐。因此需要使用一种方式,把这些命令组织起来。当程序想要编译和链接的时候,只需要一步操作就可以完成。

实现这种方式的工具是cmake工具,cmake是一个跨平台的工具,可以编写Cmakelist.txt文件完成上述操作,Cmakelists.txt也是一个跨平台的文件。在不同的平台下使用 cmake命令,会将Cmakelists.txt生成一个不同的文件,而makefile就是在linux系统下生成的文件。生成的makefile文件需要执行make命令完成程序的编译与链接。在linux系统中可以直接编写makefile文件。

简单的makefile的书写

仍然以前面的main.cpp,test1.cpp,test1.hpp为例。编写的makefile文件如下:

另外一种更加常用的写法是:

先大致浏览一下上面的makefile文件,可以看出,makefile的规则格式是:

这个就是makefile文件的核心规则,makefile文件就是多种这样的命令格式的组合.对照example1.example2可以看出,这个makefile文件其实就是之前编译链接的步骤,只不过这个需要符合一定的格式。

这里需要生成的目标其实只是一个名称而已,可以任意取,但是不知道为什么我所看到的很多程序都是按照example2的方式书写,可能是感觉更加规范吧。还有一种很常见的是在生成.o文件的命令中,添加.h的依赖项,例如:

test1.o:test1.hpp

g++ -c test1.cpp

其实这个也是没有必要的,因为在test1.cpp中会根据自己的include自动添加.hpp文件。

简单的makefile如何运行

a. 在终端中输入make命令,会自动搜索当前路径下的makefile或者是Makefile文件。

b.开始执行第一行的命令,根据第一行命令需要找到所要依赖的main.o和test1.o文件,如果搜索路径(当前路径和默认路径)中不存在main.o,test1.o或者是main.c与test1.cpp有修改,则开始执行后面的命令,生成所需要的.o文件,反之,不执行后面的语句,直接执行该命令。

c.按照example2中的makefile的书写,执行make命令后,可以看到程序执行了后面的命令,最后执行开始的命令。

d.在具体要执行的命令行之前加上@符号命令可以不在终端中显示。

e.可以通过在makefile文件中添加一些指令,达到与在终端中运行命令相同的效果,这个被称之为伪指令。在makefile中用来清理产生的文件。

example3:

在终端中输入 make clean就可以清理产生的main.o ,test1.o和test1文件,与在终端中输入

rm main.o test1.o test1有一样的效果。

makefile的简化操作

a.字符变量的使用

example4:

由例子可以知道:可以=号给多个变量赋值到一个字符变量中,然后通过$(字符变量)的方式代替多个变量。

ATTENTION:除此之外:还有?=, :=, +=等赋值符号

?=表示如果字符变量已经赋值过了,则不在进行赋值

+=表示追加赋值

b.使用自动推导简化makefile文件

在例子中,当第一行命令确定需要使用main.o和test1.o文件时,可以自动推导出g++ -c命令,不需要自己在写。例如:

example5:

进一步简化

example6:

把变量添加进去,进一步简化

example7:

c++ 编译添加dll_linux下编写C/C++代码须知———串讲相关推荐

  1. spdlog linux编译出错,Linux下编写Makefile引入第三方库

    Linux下编写Makefile引入第三方库 前言:一直在使用CmakaList 生成Makefile文件,其实很少去写Makefile,但是最近帮朋友处理了一个Makefile引入第三方库的问题,就 ...

  2. as 怎么将多个cpp文件代码编译成so_你编写的Java代码是咋跑起来的?

    如果你是一名 Java 开发人员,你肯定指定 Java 代码有很多种不同的运行方式.比如说可以在开发工具(IDEA.Eclipse等)中运行,可以双击执行 jar 文件运行,也可以在命令行中运行,甚至 ...

  3. 【树莓派开发】使用树莓派在Linux环境下编写C语言代码

    文章目录 前言 1.创建test.c文件 2.编译运行该文件 3.编译并链接两个源文件 结语 前言 如何使用树莓派编译C语言代码呢? 21年暑假的时候,学习编程的劲头高涨,然后冲动消费买了个树莓派4B ...

  4. c++ 编译添加dll_Windows下osg编译

    一.准备工作 1.1 资料准备 1.2 环境说明 二.编译准备 2.1 目录树 2.2 ffmpeg插件编译问题处理 三.cmake配置 四.编译 五.环境变量配置 六.OSG项目 6.1 创建并配置 ...

  5. 在Windows下编写的代码,实时在Linux下编译

    方法一: 如何实现在Windows7下编写Linux程序,写完程序以后,不用拷贝文件,直接在Linux(RHEL6.5)机器上编译最新的代码. 1.首先将Windows的代码文件夹设置为共享文件夹: ...

  6. g++ linux 编译开栈_Linux下编写C++服务器(配置C++编译调试环境)

    Linux下编写C++服务器(配置C++编译调试环境) 安装好linux虚拟机,确定能上网后,我们可以开始编写C++程序了,但在这之前我们需要下载编译器和调试器 下载gcc 1.在终端输入yum se ...

  7. linux怎么添加头文件目录下,linux下编写c++,include的那些头文件在什么地方?

    炎炎设计 C/C++程序在linux下被编译和连接时,GCC/G++会查找系统默认的include和link的路径,以及自己在编译命令中指定的路径.自己指定的路径就不说了,这里说明一下系统自动搜索的路 ...

  8. Ubuntu16.04下创建工作空间并添加自己的功能包(python代码)

     话不多说,直接上步骤 1. 创建工作空间     1.1 创建工作空间 工作空间其实就是一个目录,我们命名为test_ws,并且在该目录下创建一个src文件夹,终端命令如下,文件结构图如下. # m ...

  9. 专业的LaTeX: 在Linux下编写高质量的文档

    专业的LaTeX: 在Linux下编写高质量的文档 Linux下的OpenOffice.KWord等字处理软件虽然在功能上与Microsoft Word类似,但目前在易用性和可用性方面仍然存在许多不足 ...

最新文章

  1. PHP artisan
  2. 详解程序包管理RPM
  3. s5-13 RIP 为什么会 衰败
  4. React开发(199):参数请求错误修改请求
  5. 【CodeForces - 260C】Balls and Boxes (思维模拟,有坑,时光倒流)
  6. 怎么赚美金_我16岁时如何赚到200,000美元
  7. MySQL03:DML语言
  8. css系列教程1-选择器全解
  9. 在百度实习的100天
  10. 快商通智能客服云平台、金融反欺诈方案获中科院互联网周刊金i奖
  11. 常用自然语言处理NLP模型原理
  12. web前端进阶<7>:3d图像翻转效果
  13. html 用户列表,用户列表.html
  14. S9赛季:盗贼竞技场\插旗中技巧攻…
  15. esp8266网络自动对时 串口字符连接 病显示 12864i2c u8g2库
  16. 【PMP备考经验】PMP 项目管理考试 5A 大神备考经验汇总(1)
  17. 数据可视化--绘制百分比堆积柱状图、簇形柱状图、并列子图
  18. python opencv读取视频没声音_python + opencv: 解决不能读取视频的问题
  19. 9款经典华丽的CSS3分享按钮
  20. Unity中精灵Sprite,精灵图集SpriteAtlas详解

热门文章

  1. android 强制打开gps定位_Android 6.0 默认关闭定位和GPS,开启后默认选省电
  2. 双击执行java_双击以执行Java程序
  3. php不同用户显示不同表单_php 实现接收多个name相同但Value不相同表单数据实例...
  4. 存储过程mysql into select into_mysql 存储过程select into select into select的搜索结果-阿里云开发者社区...
  5. 尚硅谷谷粒学院2020 高级篇代码_尚硅谷联合KubeSphere ,共同打造企业级云原生课程!...
  6. Git config 查看和设置配置信息
  7. TestNG测试框架之测试用例的执行顺序分析
  8. httpClient 超时时间设置
  9. python中选择结构通过什么语句实现_Python中选择结构通过什么语句实现
  10. python的整数类型有几种进制_(一)Python入门-2编程基本概念:08整数-不同进制-其他类型转换成整数...