背景:
至今毕业有3年零3个月,关于工作经历,在2年零10个月时从一家互联网企业转到IC企业,虽然是测试,对自己也是一个不小的挑战,毕竟IC行业之前从未涉及。感觉离嵌入式更近了,作为一个网络专业和软件专业的人,毕业了从事嵌入式相关的工作,也是佩服自己的勇气(自夸一下下)。
总的来说就是基础知识太薄弱,看书或者视频或者网站,想要记录记录相关的知识点。今天从本篇开始作为一个起点,期待后面自己能及时更新笔记,更新自己的知识库,加油!
关于版权问题,因为都是学习过来的知识点,会详细备注,如有侵权知道后会及时删除。
学习笔记一《C程序设计新思维》 本·克莱蒙(Ben Klemens)著,赵岩译
这几个月发现芯片开发,C语言紧密详细,正巧在公司的书架上看到了本书这么高级的名字,打算学学艺,提升提升自己
一. 编译环境相关
编译环境是工作开始的前提,本书推荐的Windows包管理工具是Cygwin,以及Windows的POSIX环境。详细不作记录。
1. 查看程序或者库函数的依赖:
- Cygwin:cygcheck libxx.dll
- Linux:ldd libxx.so
- Mac:otool -L libxx.dylib
2. 链接函数库
2.1 记: erf(x)是C99标准的误差函数,是与平均数为0,均方差为sqrt(2)的从0到x的正则分布的积分紧密相关
2.2 记一个完成的gcc编译指令: gcc erf.c -o erf -lm -g -Wall -O3 -std=gnull
-l是一个选项,用来指示某个库需要被链接进来
-lc 要求链接器链接标准libc库
-o 指定编译后可执行文件名,否则编译后可执行文件名为a.out
-g 加入调试信号,调试器会显示变量或函数名
-std=gnull gcc特有的选项,允许使用符合C11和POSIX标准的代码,否则可能将一些目前有用的语法判定为非法。
-O3 优化等级为3,如果防止优化影响代码执行,则换成-O0, 这是常见的CFLAGS参数调整
-Wall 添加编译器警告
-I(大写的i) 添加指定的路径到头文件的搜索路径范围 例:gcc -I/usr/local/include test.c -o test -L/usr/local/lib -ltest 【第一个为大写I,第二个为小写l】
-L 添加指定的路径到库的搜索路径范围内
例子:如果specific.o依赖于Libboard库,而Libboard库依赖于Libgeneral,那么正确的编译命令为:gcc specific.o -lboard -lgeneral. (将-l放到前面都有可能错误,因为连接器首先查找第一个目标,将无法解析的函数结构和变量名记入一个列表,然后链接器依次查找下一个目标,查找缺失的项目)
2.3 pkg-config简单的说就是向用户提供相应库的路径,版本号,头文件路径等信息的综合调用程序。根据书中的内容,输入以下命令可以查询得到对应的结果(pkg-config应包含.pc文件)
如pkg-config --libs gsl libxml-2.0 ==> -lgsl -lgslcblas -lm -lxml2
pkg-config --cflags gsl libxml-2.0 ==> -I/usr/include/libxml2
在命令行,gcc支持直接将pkg-config的查询结果替换输入,只需要用单引号''包含即可。
2.4 运行时连接:
Autotool打包程序,Libtools知道如何添加合适的选项
gcc, clang, icc基于一个在libpath中的库编译程序时,需要添加:
LDADD=-Llibpath -Wl,-Rlibpath
-L告诉编译器到哪里找库函数解析符号
-Wl选项从gcc传递这个选项到链接器,链接器将给定的-R嵌入所链接的库的运行时搜索路径
有两个全局宏:LD_LIBRARY_PATH, DYLD_LIBRARY_PATH
3. MAKEFILE
3.1 makefile可以看做是结构化的变量和一系列操作的shell脚本。
简单的编译命令测试程序如下所示:
1 ubuntu $ cat helloworld_test.c 2 #include <stdio.h> 3 int main() 4 { 5 printf("Hello, world.\n"); 6 return 0; 7 } 8 9 ubuntu $ cat Makefile 10 P=helloworld_test 11 OBJECTS= 12 CFLAGS = -g -Wall -o3 13 LDLIBS= 14 CC=gcc 15 16 $(P): $(OBJECTS) 17 18 ubuntu $ make 19 gcc -g -Wall -o3 helloworld_test.c -o helloworld_test 20 21 ubuntu $ ls 22 Makefile helloworld_test helloworld_test.c 23 24 ubuntu $ ./helloworld_test 25 Hello, world.
3.2 makefile语法
变量: 使用$(),任何对于一个的字符都需要使用(),也可以在shell中直接export
make设置变量并独立于shell: make CFLAGS="-g -Wall" / CFLAGS="-g -Wall" make
C代码中的getenv函数可以得到环境变量。
内置变量:$@ 返回完整的目标文件名
$* 不带文件名后缀的目标文件
$< 触发和制作该目标的文件的名称
规则:查看make内置的全部默认规则和变量列表 make -p
target: dependencies
script
例: $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $*.c
3.3 here文档