gcc -I(大写的i),-L(大写L)和-l(小写的L)详解

时间:2022-12-03 18:23:16

以下内容为自己摘录网上的和自己总结的,如有疏漏之处望包含。

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。

我们源码中使用了不在默认搜索头文件路径中的头文件(默认路径为:/usr/include;/usr/local/include和当前目录),我们就需要使用-I指定头文件的目录。比如:头文件放在/myinclude目录里,那编译命令行就要加上-I/myinclude参数了,如果不加你会得到一个"xxxx.h: No such file or directory"的错误。

-L /home/hello/lib表示将/home/hello/lib目录作为第一个寻找库文件的目录,寻找的顺序是:/home/hello/lib-->/lib-->/usr/lib-->/usr/local/lib。-L指定库文件的目录,也就是如果链接时候,需要的动态库或是静态库不在默认的路径中,就需要用-Lxxx指定库文件路径

-lworld表示在上面的lib的路径中寻找libworld.so动态库文件(如果gcc编译选项中加入了“-static”表示寻找libworld.a静态库文件)。-l(注意:小写的L,不是大写的i)指定链接的库文件,顺便提一下库文件的命名,一般是libxxx.so(动态库,xxx为库文件的名字,例如hello库文件),libxxx.a(静态库)。

问题:为什么会出现undefined reference to 'xxxxx'错误

例如: In function `main':

passwd.c:(.text+0x8d): undefined reference to `crypt'
passwd.c:(.text+0xef): undefined reference to `crypt'
collect2: error: ld returned 1 exit status

首先这是链接错误,不是编译错误,也就是说如果只有这个错误,说明你的程序源码本身没有问题,是你用编译器编译

时参数用得不对,你没有指定链接程序要用到得库,比如你的程序里用到了一些数学函数,那么你就要在编译参数里指

定程序要链接数学库,方法是在编译命令行里加入-lm。