编译

1 原理

编译器分类

gcc:c

g++:c++

静态库 动态库 静态链接 动态链接

https://www.runoob.com/w3cnote/cpp-static-library-and-dynamic-library.html

1 静态库 动态库

库是写好的现有的,成熟的,可以复用的代码 和python的 包一样

可以编译生成静态库和动态库

静态库.a(linux) , .lib(win) 动态库.so(linux) , .dll(win)

2 静态链接 动态链接

静态链接:静态库在程序编译时会被连接到目标代码中,程序运行时将不再需要该静态库,因此体积较大。

动态链接:动态库在程序编译时并不会被连接到目标代码中,而是在程序运行是才被载入,因此在程序运行时还需要动态库存在,因此代码体积较小.不同的应用程序如果调用相同的库,那么在内存里只需要有一份该共享库的实例。带来好处的同时,也会有问题!如经典的DLL Hell问题,关于如何规避动态库管理问题

编译过程

https://developer.aliyun.com/article/1154672

可执行文件有main

so没有main

2 命令行编译

3 构建工具

1 为什么要构建工具呢?

当你的程序只有一个源文件时,直接就可以用gcc命令编译它。但是当你的程序包含很多个源文件时,用gcc命令逐个去编译时,你就很容易混乱而且工作量大,为什么呢?
因为各个文件之间还涉及到互相访问与链接,错综复杂的关系一个一个处理很麻烦,很容易出错,素衣需要一个工具来制定一个很好的编译规则,这就是make的作用了

2 vs(Visual Studio)为什么可以直接编译一个工程?

因为vs创建的工程,所有添加的文件都有链接管理

1 cmake

2 bazel

1 build文件

1 哪些文件要写

所有用到的文件都需要

2 怎么写

比如某个cpp

deps: 当前cpp 需要用到某个头文件,那这个头文件就要写到这

2 bazel clean

3 编译可执行文件

bazel build -c opt //opt/data:test

生成路径:bazel-bin/opt/data/test

4 编译.so

https://blog.csdn.net/zyq880625/article/details/131393651

5 编译选项

—strip=always

—copt=”-g”

6 交叉编译

https://zhuanlan.zhihu.com/p/422055988

https://blog.csdn.net/pengfei240/article/details/52912833

问题

Author

Lavine Hu

Posted on

2023-04-16

Updated on

2024-05-03

Licensed under

Comments

:D 一言句子获取中...