分类: LINUX
2016-09-19 09:51:34
我们用gcc编译程序时,可能会用到“-I”(大写i),“-L”(大写l),“-l”(小写l)等参数,下面做个记录:
例:gcc -o hello hello.c -I /home/hello/include -L /home/hello/lib -lworld
上面这句表示在编译hello.c时:
(大 写I小写i的I)-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
(大写L小写l的l)-lworld表示在上面的lib的路径中寻找libworld.so动态库文件(如果gcc编译选项中加入了“-static”表示寻找libworld.a静态库文件) 如 -lpthread 寻找线程库
After reading the that jeremiah posted, i found the gcc flag that works without the symlink:
gcc -B/usr/lib/x86_64-linux-gnu hello.c
So, you can just add -B/usr/lib/x86_64-linux-gnu to the CFLAGS variable in your Makefile.
在主make里修改CFLAGS := -I/4.2.2-eabi/usr/include -B/4.2.2-eabi/usr/lib
////
-Bprefix
这 个选项指定GCC到哪去查找自己的可执行文件、库文件、头文件和数据文件。编译器驱动程序运行一个或多个子程序如ccp,cc1,as,ld。当编译器需 要运行某个子程序时,它将prefix作业子程序的前缀(如prefix/as)。为了正确运行每个子程序,编译器驱动程序首先-B选项指定的前缀,如果 那个可文件(如prefix/as)没有查找到或者没有指定-B选项,则编译器驱动程序将尝试使用标准前缀:/usr/lib/gcc/ 和/usr/local/lib/gcc/。如果用这两个前缀也没查找到,则使用没有修改过的程序名(如as)在PATH环境变量指定的路径下查找。
编译器会核查-B选项提供的前缀(目录),必要情况下编译器会在最后加一个分隔符。如-B/usr/bin 则最后的前缀会为:/usr/bin/,编译器在最后增加了分隔符。
-B 选项指定的前缀同样对链接器查找库文件有效,因为编译器会将该选项转换为-L选项。另外-B选项同样也对预处理器查找头文件时有效,因为编译器会将该选项 转换为预处理器中的-isystem选项,在这种情况下,编译器会在prefix最后加上“include”即prefix/include。
如果需要,运行时库文件“libgcc.a”同样会通过-B选项指定的前缀来查找,如果没找到,则接着会尝试用上面提到的那两个标准前缀查找,如果还没有找到,则会忽略掉对libgcc.a的链接。
另外一种指定prefix前缀的方式是通过环境变量GCC_EXEC_PREFIX来指定,不过会在-B选项指定的前缀之后搜索。即先尝试用-B选项指定的前缀再尝试使用GCC_EXEC_PREFIX指定的前缀,再用标准前缀。其实前面提到的两个标准前缀应该是在安装编译器是指它的!!所以每个系统可能还不一样。