编译
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