苏嵌实训-嵌入式linux C 第 4 天

目录

  • 苏嵌实训-嵌入式linux C 第 4 天
    • 日报表
    • 作业
      • 1. 编译器三级优化分别优化了哪些
      • 2. gcc 静态库和动态库制作
      • 3. cmake用法

苏嵌实训-嵌入式linux C 第 4 天

日报表

项目名称 【苏嵌实训-嵌入式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 编译工程
其他

作业

1. 编译器三级优化分别优化了哪些

  • 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优化

原文链接:编译器如何代码优化

2. gcc 静态库和动态库制作

// 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

3. cmake用法

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

你可能感兴趣的:(苏嵌实训-嵌入式linux C 第 4 天)