nanzh

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

背景:

    至今毕业有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文档

posted on 2021-09-26 23:10  深海里的星星nanzh  阅读(61)  评论(0编辑  收藏  举报