项目名称 | 【苏嵌实训-嵌入式linux C 第4天】 |
---|---|
今日进度以及任务 | 1. 程序的编译过程、gcc 编译器的命令选项、gcc 编译优化 2. 制作静态库、动态库 3. gdb 调试代码,熟练使用 gdb 指令 4. 用 make 自动编译工程,写 Makefile 5. 自学 cmake 编译工程,学会写 CMakeLists.txt |
本日任务完成情况 | 1. 练习使用 gcc 编译程序,并掌握 -E,-c,-o,-D,-I等选项 2. 学会制作静态库和动态库,用 gdb 调试代码 3. 练习用 make 和 cmake编译程序 所有任务都已完成 |
本日开发中出现的问题汇总 | 无 |
本日未解决问题 | 无 |
本日开发收获 | 1. 学会程序编译成可执行文件的过程、gcc 的命令 2. 学会gdb调试代码,make、cmake 编译工程 |
其他 | 无 |
- O 基本的优化
- fdefer-pop 默认方法返回时,会将输入参数出栈,这个优化可以将输入参数在栈上累计,并通过一个命令一次清空所有栈上数据
- fmerge-constant 合并程序中相同的constant变量
- fthread-jumps 使得编译器分析代码,可以跳过不必要的分支,直接到达最终的目的分支
- floop-optimize 优化循环中的变量等信息
- fif-conversion 优化if分支
- fif-conversion2 采用高级数学优化分支
- fdelay-branch 通过重排指令的方式,最大程度的利用指令缓存
- fguess-branch-probability 通过分支预测重排指令,可能导致两次编译的结果不一致,不建议使用
- fcprop-registers 编译器检查变量的寄存器,减少调度依赖和不必要的寄存器拷贝
- O2 比较高级的优化
- fforce-mem 强制所有存储在内存中的变量在使用前被存储在寄存器中
- foptimize-sibling-calls 主要用于处理递归方法
- fstrength-reduce 用于优化循环中的迭代变量
- fgcse 用于优化生成汇编代码中的公共代码,减少冗余代码段
- fcse-follow-jumps 通过分析公共子程序消除不能到达的分支
- frerun-cse-after-loop 是的循环中被优化的代码进一步优化
- fdelete-null-pointer-checkers 扫描生成的汇编代码以检查空指针代码
- fexpensive-optimizations 从编译时的角度进行优化
- fregmove 编译器尝试重新分配MOV指令中的寄存器,以便最大程度的使用寄存器绑定的数量
- fschedule-insns 编译器试图重排指令以消除处理器等待数据
- fsched-interblock 是的编译器可以跨块调度指令
- fcaller-saves 指示编译器在不需要保存和重载的情况下替换寄存器的值
- fpeephole2 启动所有机器级别的优化
- freorder-blocks 重排指令块以优化分支和本地代码
- fstrict-aliasing 执行高级语言的严格变量规则,使得不同变量的数据使用不同的存储空间
- funit-at-a-time 是的机器在阅读完所有的机器代码后执行优化,需要大量的内存
- falign-function 是的方法开始在指定大小的对齐位置
- falign-loops 是的循环开始在指定大小对齐的位置
- fcrossjumping 将交叉跳转代码整合
- O3 最高等级的优化
- finline-functions 会将被调函数代码整合到调用函数中
- fweb 构建伪寄存器网络保存变量
- fgcse-after-reload 这种技术会执行二次gcse优化
原文链接:编译器如何代码优化
// add.c
int add(int a,int b){
return (a+b);
}
// sub.c
int sub(int a,int b){
return (a-b);
}
// main.c
#include
int main(){
printf("%d\n", add(2,3));
printf("%d\n", sub(2,3));
return 0;
}
静态库 libcla.a
gcc -c add.c
gcc -c sub.c
ar rcs libcla.a add.o sub.o
gcc main.c -lcla -L. -o main
./main
动态库 libcla.so
gcc -shared -fPIC add.c sub.c -o libcla.so
gcc main.c ./libcla.so -o main
./main
1.cmake 编译工程:
工程目录结构
[vic@localhost test]$ tree
.
├── CMakeLists.txt
├── include
│ └── cla.h
└── src
├── cla.c
└── main.c
2 directories, 4 files
CMakeLists.txt 内容:
cmake_minimum_required(VERSION 2.8.12.2)
project(main)
include_directories(include)
file(GLOB SOURCES "src/*.c")
add_executable(main ${SOURCES})
cmake生成 Makefile 文件
[vic@localhost test]$ cmake .
-- Configuring done
-- Generating done
-- Build files have been written to: /home/vic/0706/test
make 编译工程
[vic@localhost test]$ make
[100%] Built target main
工程编译后的目录结构
[vic@localhost test]$ tree -L 2
.
├── CMakeCache.txt
├── CMakeFiles
│ ├── 2.8.12.2
│ ├── cmake.check_cache
│ ├── CMakeDirectoryInformation.cmake
│ ├── CMakeOutput.log
│ ├── CMakeTmp
│ ├── main.dir
│ ├── Makefile2
│ ├── Makefile.cmake
│ ├── progress.marks
│ └── TargetDirectories.txt
├── cmake_install.cmake
├── CMakeLists.txt
├── include
│ └── cla.h
├── main
├── Makefile
└── src
├── cla.c
└── main.c
6 directories, 15 files
运行工程
[vic@localhost test]$ ./main
add = 9
sub = 3
mul = 18
div = 2
2.动态库编译(.so)
CMakeLists.txt 内容:
cmake_minimum_required(VERSION 2.8.12.2)
project(main)
include_directories(include)
file(GLOB SOURCES "src/*.c")
add_library(main SHARED ${SOURCES})
cmake生成 Makefile 文件
[vic@localhost test]$ cmake .
-- Configuring done
-- Generating done
-- Build files have been written to: /home/vic/0706/test
make 编译工程
[vic@localhost test]$ make
Scanning dependencies of target main
[ 50%] Building C object CMakeFiles/main.dir/src/cla.c.o
[100%] Building C object CMakeFiles/main.dir/src/main.c.o
Linking C shared library libmain.so
[100%] Built target main
工程编译后的目录结构
[vic@localhost test]$ tree -L 2
.
├── CMakeCache.txt
├── CMakeFiles
│ ├── 2.8.12.2
│ ├── cmake.check_cache
│ ├── CMakeDirectoryInformation.cmake
│ ├── CMakeOutput.log
│ ├── CMakeTmp
│ ├── main.dir
│ ├── Makefile2
│ ├── Makefile.cmake
│ ├── progress.marks
│ └── TargetDirectories.txt
├── cmake_install.cmake
├── CMakeLists.txt
├── include
│ └── cla.h
├── libmain.so
├── main
├── Makefile
└── src
├── cla.c
└── main.c
6 directories, 16 files
运行工程
[vic@localhost test]$ ./main
add = 9
sub = 3
mul = 18
div = 2
3.静态库编译 (.a)
CMakeLists.txt 内容:
cmake_minimum_required(VERSION 2.8.12.2)
project(main)
include_directories(include)
file(GLOB SOURCES "src/*.c")
add_library(main STATIC ${SOURCES})
cmake生成 Makefile 文件
[vic@localhost test]$ cmake .
-- Configuring done
-- Generating done
-- Build files have been written to: /home/vic/0706/test
make 编译工程
[vic@localhost test]$ make
[ 50%] Building C object CMakeFiles/main.dir/src/cla.c.o
[100%] Building C object CMakeFiles/main.dir/src/main.c.o
Linking C static library libmain.a
[100%] Built target main
工程编译后的目录结构
[vic@localhost test]$ tree -L 2
.
├── CMakeCache.txt
├── CMakeFiles
│ ├── 2.8.12.2
│ ├── cmake.check_cache
│ ├── CMakeDirectoryInformation.cmake
│ ├── CMakeOutput.log
│ ├── CMakeTmp
│ ├── main.dir
│ ├── Makefile2
│ ├── Makefile.cmake
│ ├── progress.marks
│ └── TargetDirectories.txt
├── cmake_install.cmake
├── CMakeLists.txt
├── include
│ └── cla.h
├── libmain.a
├── libmain.so
├── main
├── Makefile
└── src
├── cla.c
└── main.c
6 directories, 17 files
运行工程
[vic@localhost test]$ ./main
add = 9
sub = 3
mul = 18
div = 2