我们在Unix/Linux系统编程时,会涉及到库、 头文件等文件的引用,这个在IDE中,IDE软件界面中提供了配置接口,比如IAR中的预编译,画面如下:
上面的红框的意思就是告诉 编译器,要将上面的目录包含,一起编译,Keil和其他的IDE中也有类似的操作。
在Unix/Linux下,是信奉“自己动手,丰衣足食”的理念的,这些库、头文件引用包含的操作,都是需要自己写代码来 实现的。假设我们的交叉编译环境就是gcc,我们先来概括下"-I"(大写i)、 "-l"(小写l)、"-L"(大写L) 这3种选项的作用
"-I"(大写i) : 可以理解为 include,是 实现 包含各种头文件的功能。
"-L"(大写L):可以理解为 location ,这个和 "-l"(小写l) 配合使用的,告诉编译器 要引用的“库”所在的位置。
"-l"(小写l):可以理解为 library ,这是后面要跟“库”名字,告诉编译器 要引用的具体“库”名字。
注意:“库”的名字是有标准格式的,一般都是"lib"字符串开头,比如libxxx.so、libxxx.a 等,把库文件名的头"lib"和尾".so"去掉就是这个库的 简称了,这样我们在使用"-l"(小写l)引用库的时候,不用带lib了,而是-lxxx。
还是来举个例子吧,假设我们的应用程序里, 需要使用库文件libmodbus.so,同时还要使用这个库文件的 几个头文件 modbus.h、modbus_rtu.h,而我们的应用程序是 man.c,文件夹结构如下所示
#文件夹、文件 包含内容
lib--------------> libmodbus.so
include----------> modbus.h modbus_rtu.h
main.c
交叉编译环境假设是gcc,那么我们在进行编译时,编译命令如下:
gcc -o AppModbus main.c -L./lib -lmodbus -I./include
# AppModbus : 可执行程序,编译结果
# main.c : 源文件
# -L./lib :引用的 库 所在位置,即 当前目录下的 lib 文件夹中
# -lmodbus :引用的 库 名称,即 modbus 库,这个因为 lib中的文件是 libmodbus.so,去掉头尾就是
# 真正的库名字。
# -I./include :要包含的头文件位置,即 当前目录下的 include 文件夹。