zoukankan      html  css  js  c++  java
  • C程序设计资料学习一:开篇

    背景:

        至今毕业有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.
    ");
     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文档

  • 相关阅读:
    厚积薄发,丰富的公用类库积累,助你高效进行系统开发(9)各种常用辅助类
    厚积薄发,丰富的公用类库积累,助你高效进行系统开发(7)声音播放、硬件信息、键盘模拟及钩子、鼠标模拟及钩子等设备相关
    厚积薄发,丰富的公用类库积累,助你高效进行系统开发(6)全屏截图、图标获取、图片打印、页面预览截屏、图片复杂操作等
    厚积薄发,丰富的公用类库积累,助你高效进行系统开发(4)CSV、Excel、INI文件、独立存储等文件相关
    DevExpress控件使用经验总结
    Winform开发框架之通用自动更新模块
    详解在数据查看界面中增加记录导航功能,你应该需要的
    使用Aspose.Cell控件实现多个Excel文件的合并
    厚积薄发,丰富的公用类库积累,助你高效进行系统开发(8)非对称加密、BASE64加密、MD5等常用加密处理
    WCF开发框架形成之旅如何实现X509证书加密
  • 原文地址:https://www.cnblogs.com/nanzh/p/15340943.html
Copyright © 2011-2022 走看看