-I -i -L -l
-I
指定头文件路径-i
指定头文件名字,不常用,因为一般都是直接在源文件开头include<*.h>-L
指定库文件路径,但要注意,处理动态链接库时有2个路径:链接时路径和运行时路径,2个路径是分开的。-L
指定的只是链接时候的路径,有可能程序链接时候成功了,但在运行时不成功。因此还有加上运行时路径方可。使用-Wl,-rpath=<your path>
。比如有个链接库libabc.so
在当前目录,因此可以这样子指定:gcc -o main -L. -labc -Wl,-rpath=.
即可。-l
指定库文件名字- #include <a.h>与#include "a.h"区别
#include <a.h> 直接到系统指定的某些目录中去找某些头文件。
#include “a.h” 先到源文件所在文件夹去找,然后再到系统指定的某些目录中去找某些头文件。 - 头文件搜索顺序
- 源文件所在路径
- 参数
-I
指定的路径
指定路径有多个路径时,按指定路径的顺序搜索 - gcc的环境变量
C_INCLUDE_PATH
CPLUS_INCLUDE_PATH
OBJC_INCLUDE_PATH
- 找系统目录
/usr/include
/usr/local/include
/usr/lib/gcc-xxxx/xxxx
- -l 默认链接的静态库(.a) 还是动态库(.so)
默认动态库,如果需要链接静态库,显式指定即可,如-l:lib*.a
, 或者加上-static
参数 - 静态库链接搜索路径的顺序
-L参数指定路径 —> 系统环境变量路径LIBRARY_PATH
—> 默认搜索路径/lib, /usr/lib, /usr/local/lib
- 动态库链接搜索路径的顺序
-L参数指定路径 —> 系统环境变量路径LD_LIBRARY_PATH
—> 配置文件/etc/ld.so.conf
中指定的动态库搜索路径 —>默认搜索路径/lib, /usr/lib, /usr/local/lib
--cflags --libs
手工来写链接参数总是很麻烦的,还好很多库开发包提供了生成链接参数的程序,名字一般叫xxxx-config
,一般放在/usr/bin
目录下,比如gtk1.2的链接参数生成程序是gtk-config
,执行gtk-config --libs
就能得到以下输出-L /usr/lib -L /usr/X11R6/lib -lgtk -lgdk -rdynamic -lgmodule -lglib -ldl -lXi -lXext -lX11 -lm
,这就是编译一个gtk1.2程序所需的gtk链接参数,xxx-config
除了–libs参数外还有一个参数是--cflags
用来生成头文件包含目录的,也就是-I
参数,在下面我们将会讲到。你可以试试执行gtk-config --libs --cflags
,看看输出结果。
除了xxx-config
以外,现在新的开发包一般都用pkg-config
来生成链接参数,使用方法跟xxx-config
类似,但xxx-config
是针对特定的开发包,但pkg-config
包含很多开发包的链接参数的生成,用pkg-config --list-all
命令可以列出所支持的所有开发包,pkg-config
的用法就是pkg-config pagName --libs --cflags
,其中pagName
是包名,是pkg-config--list-all
里列出名单中的一个,比如gtk1.2的名字就是gtk+
,pkg-config gtk+ --libs --cflags
的作用跟gtk-config --libs --cflags
是一样的。比如:gcc gtktest.c `pkg-config gtk+ --libs --cflags`
.
-shared
表示生成动态链接库
-static
禁止使用共享库
-w
不生成警告信息
-Wall
生成所有警告信息