2020-07-06

苏嵌嵌入式Linux实训 第三天
总结,对于我来说,要写的代码越来越多,要记的命令越来越多,行动跟上了,脑子却跟不上。今天网卡了半天,啥也没看见,还是努力看回放吧。加油!
1.编译器三级优化分别优化了哪些?
第一级:代码调整代码调整是一种局部的思维方式;基本上不触及算法层级;它面向的是代码,而不是问题; 所以:语句调整,用汇编重写、指令调整、换一种语言实现、换一个编译器、循环展开、参数传递优化等都属于这一级;这个级别的优化需要掌握大量的小的优化技巧和知识,需要不断的积累;简单的语句调整、公共表达式提取、废代码删除等当前的很多编译器也能做到了,但也需要了解一些编译器的优化能力使自己的代码配合编译器做好优化;用汇编重写并不是简单把高级语言改写为汇编实现,那样写的汇编很可能没有当今的编译器产生的代码好,所以如果决定用汇编实现,那就应该按照汇编的角度来规划自己的实现,适当的参考编译器生成的汇编码也是可取的(特别是新手,我也一样);在某些领域,使用CPU的新特性和新的指令集等将产生巨大的性能收益,这些地方经常采用汇编来实现。第二级:新的视角新的视角强调的重点是针对问题的算法;即选择和构造适合于问题的算法;(冒泡排序还是快排的选择问题是这一级早就应该完成的)很多经典算法都对问题作了一些假设(包括我们当前已经完成的算法实现),而在面对实际问题时“新的视角”提示我们应该重新检视这些假设,并尝试不同的思考问题的角度,寻求适合于问题的新算法;发掘问题的本来意义,从不同的角度思考面对的问题,使用适合于问题的的算法; 尝试打破一些规则,发掘和怀疑自己的某些假定,恢复问题的本来面目;第三级:表驱动状态机将问题抽象为另一种等价的数学模型或假想机器模型,比如构造出某种表驱动状态机;这一级其实是第二级的延伸,只是产生的效果更加明显,但它有其本身的特点(任何算法和优化活动都可以看作是他的投影);这一级一般可以产生无与伦比的快速程序, 要达到这一级需要大量修炼的;并且思考时必须放弃很多已有的概念或者这些概念不再重要,比如:变量、指针、空间、函数、对象等,剩下的只应该是那个表驱动状态机; 我想把这种境界描述为:空寂中,一些输入驱动着一个带有状态的机器按设定好的最短路线运转着;除此之外have nothing; 既:把解决一个问题的算法看作一个机器,它有一些可变的状态、有一些记忆、有一些按状态运行的规则,然后一些输入驱动这个机器运转;这就是第三级要求的思考优化问题的切入点,也就是寻找一部机器,使它运行经过的路径最短(可能是速度也可能是空间等等)
2.总结gcc静态库与动态库的制作静态库:制作步骤主要以下几步
:1)根据源文件使用gcc -c 自动生成.o文件gcc -c *.c -I …/include
2)使用ar命令将.o文件归档ar rcs libmylib.a *.o
动态库:制作步骤主要以下几步:
1)使用-fpic参数将源文件编译成.o文件gcc *.c -c -fpic
2)使用gcc -shared打包gcc -shared *.o -o libmylib.so
3.总结CMake用法
一、 基本使用

安装:下载二进制包后可直接解压使用

从源码安装则执行命令:./bootstrap; make; make install——尝试执行bootstrap失败

使用:cmake dir_path,生成工程文件或makefile文件

二、 概念

out-of-source build,与in-source build相对,即将编译输出文件与源文件放到不同目录中;

三、 基本结构

1,依赖CMakeLists.txt文件,项目主目标一个,主目录中可指定包含的子目录;

2,在项目CMakeLists.txt中使用project指定项目名称,add_subdirectory添加子目录

3,子目录CMakeLists.txt将从父目录CMakeLists.txt继承设置(TBD,待检验)

四、 语法

#注释
1
变量:使用set命令显式定义及赋值,在非if语句中,使用KaTeX parse error: Expected 'EOF', got '#' at position 62: …nd (args ...) #̲命令不分大小写,参数使用空格分…{var}) <=> Add_executable(a b c) #变量使用${xxx}引用
1
条件语句:
1
if(var) #var 非empty 0 N No OFF FALSE… #非运算使用NOT


1
else()/elseif() … endif(var)

循环语句
1
Set(VAR a b c)

Foreach(f ${VAR}) …Endforeach(f)

循环语句
1
WHILE() … ENDWHILE()

五、 内部变量

CMAKE_C_COMPILER:指定C编译器

CMAKE_CXX_COMPILER:

CMAKE_C_FLAGS:编译C文件时的选项,如-g;也可以通过add_definitions添加编译选项

EXECUTABLE_OUTPUT_PATH:可执行文件的存放路径

LIBRARY_OUTPUT_PATH:库文件路径

CMAKE_BUILD_TYPE::build 类型(Debug, Release, …),CMAKE_BUILD_TYPE=Debug

BUILD_SHARED_LIBS:Switch between shared and static libraries

内置变量的使用:

在CMakeLists.txt中指定,使用set

cmake命令中使用,如cmake -DBUILD_SHARED_LIBS=OFF

六、 命令

project (HELLO) #指定项目名称,生成的VC项目的名称;

使用${HELLO_SOURCE_DIR}表示项目根目录

include_directories:指定头文件的搜索路径,相当于指定gcc的-I参数

include_directories (${HELLO_SOURCE_DIR}/Hello) #增加Hello为include目录

link_directories:动态链接库或静态链接库的搜索路径,相当于gcc的-L参数

link_directories (${HELLO_BINARY_DIR}/Hello) #增加Hello为link目录
1
add_subdirectory:包含子目录

add_subdirectory (Hello)
1
add_executable:编译可执行程序,指定编译,好像也可以添加.o文件

add_executable (helloDemo demo.cxx demo_b.cxx) #将cxx编译成可执行文件——
1
add_definitions:添加编译参数

add_definitions(-DDEBUG)将在gcc命令行添加DEBUG宏定义;

add_definitions( “-Wall -ansi –pedantic –g”)

target_link_libraries:添加链接库,相同于指定-l参数

target_link_libraries(demo Hello) #将可执行文件与Hello连接成最终文件demo

add_library:

add_library(Hello hello.cxx) #将hello.cxx编译成静态库如libHello.a

add_custom_target:

message( status|fatal_error, “message”):

set_target_properties( … ): lots of properties… OUTPUT_NAME, VERSION, …

link_libraries( lib1 lib2 …): All targets link with the same set of libs

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值