在做大型工程的时候,除了有C++语法知识之外,还要有工程能力。

最先要具备的能力是:

理解C++文件的编译,链接过程。

明白C++头文件的搜索路径。

本文,介绍C++的文件搜索路径。

对于C++文件来说,主要有两种,一种是.h文件,一种是.cpp文件。

其中.h文件,相对来说,不那么重要。因为.cpp文件里会#include "a.h"一下,这样.h文件会在预编译阶段被加入到.cpp中,实质上,这是一种强制的替换。

谁来执行这个替换呢?是gcc,这个编译器。

gcc这个编译器会先对代码进行编译,甚至进行代码优化,再进行链接。

编译的过程也分为几个阶段,但不重要,主要是cpp文件会被编译成一个os文件。这是一个二进制文件。每一个cpp文件要变成程序,就需要一个os文件。这个编译的过程中,gcc会对C++代码进行代码优化,这个中间过程,可以看编译原理之类的书,我目前在搞这些,枯燥无味,却不得不做,因为性能要达标。

编译完了,就会进行链接:所谓的链接,就是把一些已经存在的库文件,链接到代码中。这个过程可以理解为:gcc有的时候只有一些库文件,也就是so文件。和它们的头文件,为啥只有so,因为头文件给接口,so就能保护源代码,从而使得程序可以以库的形式卖出价格。这些库文件的so要和我们自己写的cpp文件生成的.so链接起来。大概就是so中有一个表,表示自己身体里有哪些代码段对应的二进制,gcc就根据这个表,根据代码的需要,把二进制段拼凑起来。

最后链接完成的,就是exe文件,也就是可执行文件。

题外话:动态链接和静态链接的区别在于,静态链接是把库文件打包复制一份到exe,而动态链接是,可执行文件运行的时候,再去机子上的环境去寻找so,再构建起来。

那么,知道了gcc是怎么编译的了,问题就来了,一个cpp中会#include "a.h“,"a.h"中可能会有"b.h",也可能是"/tvm/b.h",那gcc怎么找b.h呢?

其实很简单,对于#include<iostream>这种:

gcc就会直奔gcc -l 这个路径指定的路径下去找。

如果gcc -l没有指定目录,它就会去usr/local下去找。

如果还是找不到,就会去local/bin里面去找。

路径可能是记错了,用的时候搜一下就好。

对于#include "hah.n"这种。

gcc就会在本目录下搜索,搜索不到,才会和<iostream>按照同样的逻辑去寻找。

多个cpp文件生成so_C++:C++的文件搜索路径相关推荐

  1. java生成pdf_Java实现PDF文件生成并且打印pdf文件 demo

    ## Java实现PDF生成并且打印pdf文件(附demo) #### 目录: 0. 效果预览 1. 准备环境 2. Java如何调用打印机进行打印 3. Java如何生成pdf打印文件 4. 实现p ...

  2. 依据BOM和已经存在的文件生成其他种类的文件

    在BOM中记录中有物料编码,物料名称,物料规格等,而且依据BOM已经生成了一些的文件,如采购规格书,这个时候需要生成相应的检验规格书模板,可以使用下面的VBA代码,具体代码如下: Function I ...

  3. 使用NPOI按照word模板文件生成新的word文件

    /// <summary>/// 按照word模板文件 生成新word文件/// </summary>/// <param name="tempFile&quo ...

  4. pb文件生成java类,根据proto文件生成pb和pb_service文件

    假如有一个HelloWorld.proto文件,内容如下: syntax = "proto3"; option java_package = "ex.grpc" ...

  5. npoi word生成HTML,使用NPOI按照word模板文件生成新的word文件

    /// /// 按照word模板文件 生成新word文件 /// /// 模板文件路径 /// 生成文件路径 /// 议案登记 public void CreateFileByTemplate(str ...

  6. 根据proto文件生成pb和pb_service文件

    假如有一个HelloWorld.proto文件,内容如下: syntax = "proto3";option java_package = "ex.grpc"; ...

  7. Cocos Creator TypeScript 中使用ProtoBuf(利用工具把proto文件生成对应的js文件以及ts文件)

    我是一枚刚入坑cocos的小白o(╯□╰)o 开发环境:Cocos Creator 1.9   (需要安装Node.js,使用npm命令) 在网上找了很久都是讲的protobuf.js的用法,但是没有 ...

  8. 【LaTex】利用ins文件和dtx文件生成cls或sty文件,latex宏包的生成与创建方法;配置宏包文件的方法,latex宏包文件放置目录

    一.宏包文件无法找到 在编译tex文件时,如果宏包文件并不在配置目录中,就会发出类似[LaTeX Error: File `pageno.sty' not found.]的错误. 二.解决方法就是自己 ...

  9. 可执行程序dll的依赖分析,dll文件32/64区分,dll的搜索路径

    1.dll文件的依赖分析可以通过 使用64位的depends.exe查看你exe依赖的dll 2.32位dll和64位dll的查看 3.dll文件的搜索路径 作者:朱金灿 来源:http://blog ...

最新文章

  1. 2月07日云栖精选夜读:观点 | 阿里云 MVP 唐俊飞:安全性可以认为是一种能力...
  2. python 可变参数 关键字参数_Python关键字及可变参数*args,**kw原理解析
  3. Filebeat常用配置
  4. 无法解决 equal to 运算中 Chinese_PRC_CI_AS 和 SQL_Latin1_General_CP1_CI_AS 之间的排序规则冲突。...
  5. CodeForces - 1350D Orac and Medians(思维)
  6. Excel 2007 Open XML文件结构(2)
  7. 2021中国新锐品牌发展研究:食品饮料行业报告
  8. STM32-通用定时器-PWM输出
  9. 一体机服务器性能,一体机的服务器
  10. matlab判断向量组线性相关性的三种方法
  11. AppStore上传已经开发好的App的方法
  12. java cpt_1、第十 - WEB开发进阶 - JavaSricpt 正则表达式
  13. NOI 2017 整数(线段树)
  14. FEC介绍(二)-详解RS编码
  15. 日版iphone5 SB 配合REBELiOS卡贴破解电信3G步骤
  16. 那些年,大厂在用的技术(前端)
  17. 中文用户名改为英文只要3步复制黏贴
  18. 做一名活动策划是什么体验?
  19. [DASCTF Apr.2023 X SU战队2023开局之战] crypto复现
  20. 零基础自学UI设计要看什么书籍和资料

热门文章

  1. apache mesos_Apache Mesos:编写自己的分布式框架
  2. 您需要了解的有关UI测试的所有信息
  3. 使用Zuul和Spring Boot创建API网关
  4. Spring Boot中带有CKEditor的AJAX
  5. jms spring_JMS和Spring:有时很重要的小事情
  6. 抓住StackOverFlowError的尾巴
  7. 哪个线程执行CompletableFuture的任务和回调?
  8. MySQL作为Kubernetes服务,可从WildFly Pod访问
  9. 简而言之,JUnit:测试结构
  10. 在Java中获取素数的无限列表