gcc 编译和makefiel编写时指定头文件和库文件的参数 -I -L -l

时间:2021-06-28 09:11:22

 

比如:

gcc -o hello hello.c -I /home/hello/include -L /home/hello/lib -lworld


上面这句表示在编译hello.c时-I /home/hello/include表示将/home/hello/include目录作为第一个寻找头文件的目录,
   寻找的顺序是:/home/hello/include-->/usr/include-->/usr/local/include
   -L /home/hello/lib表示将/home/hello/lib目录作为第一个寻找库文件的目录,
   寻找的顺序是:/home/hello/lib-->/lib-->/usr/lib-->/usr/local/lib
       -lworld表示在上面的lib的路径中寻找库文件(如果gcc编译选项中加入了“-static”表示寻找libworld.a静态库文件)

但注意:-static显得有些’暴力’,因为他会把命令行中-static后面的所有-l指明的库都静态链接。

而一般的是采用如-Wl,-Bstatic告诉链接器使用-Bstatic选项,该选项是告诉链接器,对接下来的-l选项使用静态链接;

-Wl,-Bdynamic就是告诉链接器对接下来的-l选项使用动态链接



#include <>直接到 指定的某些目录中去找某些头文件。 注意-I 属于该类型
#include “”先到源文件所在文件夹去找,然后再到系统指定的某些目录中去找某些头文件。
       “”中可以用类似“../inc/bluetooth/hci.h”:包含源文件上层目录中Inc下Bluetooth中的hci.h.
头文件搜索顺序:
1.由参数-I指定的路径(指定路径有多个路径时,按指定路径的顺序搜索)
2.然后找gcc的环境变量 C_INCLUDE_PATH, CPLUS_INCLUDE_PATH, OBJC_INCLUDE_PATH
3.再找内定目录
/usr/include
/usr/local/include


当对动态库与静态库混合连接的时候,使用-static会导致所有的库都使用静态连接的方式。这时需要作用-Wl的方式: gcc test.cpp -L. -Wl,-Bstatic -ltestlib  -Wl,-Bdynamic -ltestlib
另外还要注意系统的运行库使用动态连接的方式,所以当动态库在静态库前面连接时,必须在命令行最后使用动态连接。库搜索路径搜索的先后顺序是:
1.编译目标代码时指定的动态库搜索路径;
2.环境变量LD_LIBRARY_PATH指定的动态库搜索路径;
3.配置文件/etc/ld.so.conf中指定的动态库搜索路径;
4.默认的动态库搜索路径/lib;
5.默认的动态库搜索路径/usr/lib。令才能正常连接,如:gcc test.cpp -L. -Wl,-Bdynamic -ltestlib -Wl,-Bstatic -ltestlib  -Wl,-Bdynamic

通过设定环境变量# export LD_LIBRARY_PATH=/zz/mydir/,可以指定动态库搜索路径,(运行时)