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文档

  • 相关阅读:
    Java异常处理
    冒泡排序法
    21个项目-MNIST机器学习入门
    Hadoop集群搭建中ssh免密登录
    利用奇异值分解简化数据
    数据集中空值替换成对应特征的平均值
    PCA降维处理
    使用FP-growth算法高效发现频繁项集
    原生js---ajax---post方法传数据
    原生js---ajax---get方法传数据
  • 原文地址:https://www.cnblogs.com/nanzh/p/15340943.html
Copyright © 2011-2022 走看看