第一 头文件的作用是对函数的声明,在程序的编译过程中(包括预处理,编译,汇编),编译器会去#include " "或者#include < >下去寻找头文件,其中#include " "指的是在当前c文件的目录,#include < >指的是系统目录(严谨的来说是工具链的目录)和自己指定的目录(格式为 -I <dir>)。
第二 库文件的作用是提高工作效率(防止外泄源码),在程序的链接过程中,编译器会去系统目录(严谨来说是工具链的目录)或者自己指定的目录(格式为 -I <dir>)下寻找库文件;找到库文件路径后,会去使用具体哪个库文件呢?格式为 -Iname,即例如libname.so(动态库)。
第三 当程序来到运行阶段时与.c和.h文件没有任何关系,因为我们运行程序通常把程序放到开发板上运行,所以与编译出来的程序和动态库有关系,在运行时程序和动态库才组装在一起,编译器会去系统目录下(开发板的/lib,/usr/lib,...)或者自己指定的目录下(命令格式为 export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/a)寻找动态库,寻找具体哪一个动态库呢?其实在链接的时候就已经确定了(例如:arm-linux-gcc -o hello main.o -lhello -L ./),但是链接的时候只是在PC端上而已,运行程序时是在开发板上运行,运行跟链接是两码事,所以运行时可以将动态库拷贝到开发板的/lib,/usr/lib目录下或者自己指定export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:./
(注意:这里以hello.c,hello.h,main.c为例,说明以下工具链的配置,当执行gcc -o hello main.c hello.c 时是给x86或者PC端编译的,而执行arm-linux-gcc -o hello hello.c main.c 或者 arm-buildroot-linux-gnueabihf-gcc -o hello hello.c main.c 时是给ARM板编译使用的)