嵌入式C语言编程

嵌入式C语言编程

C语言概述

C语言的特点?(嵌入式开发为什么选择C语言)

能够直接访问硬件、运行效率高、移植性

面向过程?面向对象?

复用性(封装)、维护性(继承)、扩展性(多态)

C语言之父?

C语言的语法标准?

C语言开发工具

  • 库文件

    保存函数和变量,里面的函数和变量只能使用,但是看不到其实现

  • 库函数

    (保存在库文件):printf scanf strcpy strcat

  • 库文件分类:
    静态库.a,在编译阶段加载
    动态可以.so:保存函数和变量,在执行阶段加载

  • 使用动态库和静态库的区别(可执行文件区别)

    1. 使用静态库编译出来的可执行文件大小 > 使用动态库编译出来的可执行文件 --->内存的开销
    2. 使用静态库编译出来的可执行文件执行速度 > 使用动态库编译出来的可执行文件执行速度
    3. 使用静态库编译的可执行文件升级 < 使用动态库编译出来的可执行文件升级
    4. 使用静态库编译的可执行文件程序部署 > 使用动态库编译出来的可执行文件程序部署
  • 库文件的存放路径

    1. 系统运行所需要的库文件:lib

    2. 第三方软件和工具运行运行所需要的库:/usr/lib

      编译时,编译器会自动到这两个目录找所需要的库文件

  • 制作静态库

    1. 将目标源文件编译成目标文件 :gcc -c 目标源文件 目标源文件 。。。。。(gcc -c add.c)

    2. 使用ar工具制作静态库:ar -rcs(库不存在就创建,存在就更新) 所要生成的库文件的名字(lib+库名+后缀.a) 目标文件

      ar -rcs libadd.a add.o

      liutao@ubuntu:~/Cyuyan/shixun$ ls
      add.c  add.h  cmake-build-debug  CMakeLists.txt  main.c
      liutao@ubuntu:~/Cyuyan/shixun$ gcc -c add.c
      liutao@ubuntu:~/Cyuyan/shixun$ ls
      add.c  add.h  add.o  cmake-build-debug  CMakeLists.txt  main.c
      liutao@ubuntu:~/Cyuyan/shixun$ ar -rcs libadd.a add.o
      liutao@ubuntu:~/Cyuyan/shixun$ ls
      add.c  add.h  add.o  cmake-build-debug  CMakeLists.txt  libadd.a  main.c
      
    3. 使用静态库:

      -l: 指定加载哪个静态库

      -L: 指定加载的库的存放路径

      //编译的库文件存放在lib或者usr/lib时
      liutao@ubuntu:~/Cyuyan/shixun$ ls
      add  add.c  add.h  add.o  cmake-build-debug  CMakeLists.txt  demo.c  libadd.a
      liutao@ubuntu:~/Cyuyan/shixun$ gcc demo.c -ladd
      /usr/bin/ld: cannot find -ladd
      collect2: error: ld returned 1 exit status
      liutao@ubuntu:~/Cyuyan/shixun$ sudo cp libadd.a /usr/lib
      [sudo] password for liutao: 
      liutao@ubuntu:~/Cyuyan/shixun$ gcc demo.c -ladd
      
      //自定义存放路径./lib(相对路径也可以是绝对路径)
      liutao@ubuntu:~/Cyuyan/shixun$ ls
      add  add.c  add.h  add.o  a.out  cmake-build-debug  CMakeLists.txt  demo.c  lib  libadd.a
      liutao@ubuntu:~/Cyuyan/shixun$ gcc demo.c -ladd -L./lib
      liutao@ubuntu:~/Cyuyan/shixun$ ls
      add  add.c  add.h  add.o  a.out  cmake-build-debug  CMakeLists.txt  demo.c  lib  libadd.a
      liutao@ubuntu:~/Cyuyan/shixun$ ./add
      add=11
      liutao@ubuntu:~/Cyuyan/shixun$ gcc demo.c //编译时会查找库
      /usr/bin/ld: /tmp/cc8FiNeQ.o: in function `main':
      demo.c:(.text+0x1e): undefined reference to `add'
      collect2: error: ld returned 1 exit status
      
      
  • 制作动态库

    1. gcc -shared -fPIC -o 库名.so 源文件.c

      liutao@ubuntu:~/Cyuyan/shixun$ gcc -shared -fPIC -o libcal.so add.c sub.c
      liutao@ubuntu:~/Cyuyan/shixun$ ls
      add  add.c  add.h  add.o  cmake-build-debug  CMakeLists.txt  demo.c  lib  libcal.so  sub.c  sub.h  sub.o
      
    2. 使用动态库

      liutao@ubuntu:~/Cyuyan/shixun$ ls
      add  add.c  add.h  add.o  cmake-build-debug  CMakeLists.txt  demo.c  lib  libcal.so  sub.c  sub.h  sub.o
      liutao@ubuntu:~/Cyuyan/shixun$ gcc demo.c ./libcal.so -o main
      liutao@ubuntu:~/Cyuyan/shixun$ ./main 
      sum = 11
      add=1
      //使用动态库编译时必须指定路径
      liutao@ubuntu:~/Cyuyan/shixun$ gcc demo.c libcal.so -o main
      liutao@ubuntu:~/Cyuyan/shixun$ ./main 
      ./main: error while loading shared libraries: libcal.so: cannot open shared object file: No such file or directory
      liutao@ubuntu:~/Cyuyan/shixun$ 
      
posted @ 2022-05-25 22:56  LiuTBaby  阅读(413)  评论(0)    收藏  举报