当我们编写程序时候,会经过 预处理、编译器、汇编器、连接器 阶段
预处理:gcc -E main.c -o main.i //引入头文件
编译器:gcc -S main.c -o main.s //引入头文件的值
汇编器:gcc -c main.c -o main.o //生成汇编语言
连接器:gcc main.c -o main
前三个阶段只对程序语法的判断,也就是说程序只要没有语法错误都会到到第三个阶段,只有在连接的时候,没有找到对应的库而报错。
举个例子:
Wang.h
Void wang(char *s);
Main.c
#include <stdio.h>
Void main()
{
Wang("test");
Printf("hello");
}
尽管我们只在main头文件中引入了头文件,而没有实现wang.c文件,也没有提供对应的wang.a /wang.so 库文件,程序依然能够运行到第三步,因为知识语法检测,同时也是我们经常调取第三方接口时,需要对方提供库文件与头文件的原因。
book@ubuntu:~/test_qt_whail/test1$ vim main.c
book@ubuntu:~/test_qt_whail/test1$ ls
main.c wang.h
book@ubuntu:~/test_qt_whail/test1$ gcc -E main.c -o main.i
book@ubuntu:~/test_qt_whail/test1$ ls
main.c main.i wang.h
book@ubuntu:~/test_qt_whail/test1$ gcc -S main.c -o main.s
book@ubuntu:~/test_qt_whail/test1$ ls
main.c main.i main.s wang.h
book@ubuntu:~/test_qt_whail/test1$ gcc -c main.c -o main.o
book@ubuntu:~/test_qt_whail/test1$ ls
main.c main.i main.o main.s wang.h
book@ubuntu:~/test_qt_whail/test1$ gcc main.c -o main
/tmp/ccXbYC4r.o:在函数‘main’中:
main.c:(.text+0xc):对‘wang’未定义的引用
collect2: error: ld returned 1 exit status
我们在程序中使用C++库的时候也是一样的,需要引入头文件,也需要有头文件对应的库,
头文件一般会在/usr/local/include/、/usr/include/c++下,可以通过whereis include查看
库文件一般存放在/user/bin/下,当程序运行时,会动态链接这里的库文件,
如果交叉编译,需要查看工具链是否支持c++11或者其他版本,工具链如果能编译成功,说明工具链中的库文件都会存在,生成的执行文件也会在 提供工具链的系统中运行,因为工具链就是通过系统源码编译而来的。
所以在嵌入式程序系统中基本不会发现没有c++库的情况,因为我们常用的c++库stl、boost都已经包含在交叉工具链中,我们只需要注意提供的这些库是哪个版本而已,
对于开发者来说 如果工具链中没有提供c++的第三方库,硬件厂家也没有提供库,那么这个库只能放弃了。如果有源码的情况可以通过交叉工具链生成对应的库再使用,常见的有opencv等三方库都是这样做来的。