gcc指定头文件路径及动态连接库路径

本文详细介绍了linux 下gcc头文件指定方法,以及搜索路径顺序的问题。另外,还总结了,gcc动态连接的方法以及路径指定,一样也讨论了搜索路径的顺序问题。本文包含了不少的例子,具备很强的操做性,但愿读者本身去走一遍。
一.#include <>与#include “”linux

#include <>直接到系统指定的某些目录中去找某些头文件。
#include “”先到源文件所在文件夹去找,而后再到系统指定的某些目录中去找某些头文件。函数

二.gcc指定头文件的三种状况:内存

1.会在默认状况下指定到/usr/include文件夹(更深层次的是一个相对路径,gcc可执行程序的路径是/usr/bin/gcc,那么它在实际工做时指定头文件头径是一种相对路径方法,换算成绝对路径就是加上/usr/include,如#include 就是包含/usr/include/stdio.h)资源

2.GCC还使用了-I指定路径的方式,即
gcc -I 头文件所在文件夹(绝对路径或相对路径都可) 源文件
举一个例子:
设当前路径为/root/test,其结构以下:
include_test.c
include/include_test.h
有两种方法访问到include_test.h。
1. include_test.c中#include “include/include_test.h”而后gcc include_test.c便可
2. include_test.c中#include 或者#include 而后gcc –I include include_test.c也可编译器

3. 参数:-nostdinc使编译器再也不系统缺省的头文件目录里面找头文件,通常和-I联合使用,明确限定头文件的位置。io

在编译驱动模块时,因为非凡的需求必须强制GCC不搜索系统默认路径,也就是不搜索/usr/include要用参数-nostdinc,还要本身用-I参数来指定内核头文件路径,这个时候必须在Makefile中指定。编译

头文件搜索顺序:
1.由参数-I指定的路径(指定路径有多个路径时,按指定路径的顺序搜索)test

2.而后找gcc的环境变量 C_INCLUDE_PATH, CPLUS_INCLUDE_PATH, OBJC_INCLUDE_PATH变量

3.再找内定目录
/usr/include
/usr/local/include
/usr/lib/gcc-lib/i386-linux/2.95.2/include
/usr/lib/gcc-lib/i386-linux/2.95.2/../../../../include/g++-3
/usr/lib/gcc-lib/i386-linux/2.95.2/../../../../i386-linux/includegcc

库文件,可是若是装gcc的时候,是有给定的prefix的话,那么就是
/usr/include
prefix/include
prefix/xxx-xxx-xxx-gnulibc/include
prefix/lib/gcc-lib/xxxx-xxx-xxx-gnulibc/2.8.1/include

三.Linux指定动态库路径

众所周知,Linux动态库的默认搜索路径是/lib和/usr/lib。动态库被建立后,通常都复制到这两个目录中。当程序执行时须要某动态库, 而且该动态库还未加载到内存中,则系统会自动到这两个默认搜索路径中去查找相应的动态库文件,而后加载该文件到内存中,这样程序就可使用该动态库中的函 数,以及该动态库的其它资源了。在Linux 中,动态库的搜索路径除了默认的搜索路径外,还能够经过如下三种方法来指定。

1.在配置文件/etc/ld.so.conf中指定动态库搜索路径。
能够经过编辑配置文件/etc/ld.so.conf来指定动态库的搜索路径,该文件中每行为一个动态库搜索路径。每次编辑完该文件后,都必须运行命令ldconfig使修改后的配置生效。

举一个例子:
全部源文件:
源文件1: lib_test.c
#include 
void prt()
{
printf(“You found me!!!/n”);
}
源文件2: main.c
void prt();
int main()
{
prt();
return 0;
}
操做过程:
咱们经过如下命令用源程序lib_test.c来建立动态库 lib_test.so。
# gcc –o lib_test.o -c lib_test.c
# gcc -shared -fPIC -o lib_test.so lib_test.o
#
或者直接一条指令:
#gcc –shared –fPIC –o lib_test.so lib_test.c
#

注意:
-fPIC参数声明连接库的代码段是能够共享的,
-shared参数声明编译为共享库。请注意此次咱们编译的共享库的名字叫作
lib_test.so,这也是Linux共享库的一个命名的惯例了:后缀使用so,而名称使用libxxxx格式。

接着经过如下命令编译main.c,生成目标程序main.out。
# gcc -o main.out -L. –l_test main.c
#

请注意为何是-l_test?

而后把库文件移动到目录/root/lib中。
# mkdir /root/lib
# mv lib_test.so /root/lib/ lib_test.so
#

最后编辑配置文件/etc/ld.so.conf,在该文件中追加一行/root/lib。

运行程序main.out:
# ./main.out
./main.out: error while loading shared libraries: lib_test.so: cannot open shared object file: No such file or directory
#
出错了,系统未找到动态库lib_test.so。找找缘由,原来在编辑完配置文件/etc/ld.so.conf后,没有运行命令ldconfig,因此刚才的修改还未生效。咱们运行ldconfig后再试试。

# ldconfig
# ./main.out
You found me!!!
#
程序main.out运行成功,而且打印出正确结果。

2.经过环境变量LD_LIBRARY_PATH指定动态库搜索路径。
经过设定环境变量LD_LIBRARY_PATH也能够指定动态库搜索路径。当经过该环境变量指定多个动态库搜索路径时,路径之间用冒号”:”分隔。下面经过例2来讲明本方法。

举一个例子:
此次咱们把上面获得的文件lib_test.so移动到另外一个地方去,如/root下面,而后设置环境变量LD_LIBRARY_PATH找到lib_test.so。设置环境变量方法以下:
# export LD_LIBRARY_PATH=/root
#
而后运行:
#./main.out
You found me!!!
#
注意:设置环境变量LD_LIBRARY_PATH=/root是不行的,非得export才行。

3.在编译目标代码时指定该程序的动态库搜索路径。
还能够在编译目标代码时指定程序的动态库搜索路径。-Wl,表示后面的参数将传给link程序ld(由于gcc可能会自动调用ld)。这里经过gcc 的参数”-Wl,-rpath,”指定
举一个例子:
此次咱们还把上面获得的文件lib_test.so移动到另外一个地方去,如/root/test/lib下面,
由于咱们须要在编译目标代码时指定可执行文件的动态库搜索路径,因此须要用gcc命令从新编译源程序main.c(见程序2)来生成可执行文件main.out。
# gcc -o main.out -L. –l_test -Wl,-rpath,/root/test/lib main.c
#

运行结果:
# ./main.out
You found me!!!
#

程序./main.out运行成功,输出的结果正是main.c中的函数prt的运行结果。所以程序main.out搜索到的动态库是/root/test/lib/lib_test.so。

关于-Wl,rpath的使用方法我再举一个例子,应该不难从中看出指定多个路径的方法:
gcc -Wl,-rpath,/home/arc/test,-rpath,/lib/,-rpath,/usr/lib/,-rpath,/usr/local/lib test.c

以上介绍了三种指定动态库搜索路径的方法,加上默认的动态库搜索路径/lib和/usr/lib,共五种动态库的搜索路径,那么它们搜索的前后顺序是什么呢?读者能够用下面的方法来试验一下:
(1) 用前面介绍的方法生成5个lib_test.so放在5个不一样的文件夹下面,要求每个lib_test.so都惟一对应一个搜索路径,并注意main.out程序输出的不一样。
(2) 运行main.out,便可看出他是那个搜索路径下的,而后删除这个路径下的lib_test.so,而后再运行。依此类推操做,便可推出搜索顺序。

能够得出动态库的搜索路径搜索的前后顺序是:

1.编译目标代码时指定的动态库搜索路径;

2.环境变量LD_LIBRARY_PATH指定的动态库搜索路径;

3.配置文件/etc/ld.so.conf中指定的动态库搜索路径;

4.默认的动态库搜索路径/lib;

5.默认的动态库搜索路径/usr/lib。

在上述一、二、3指定动态库搜索路径时,均可指定多个动态库搜索路径,其搜索的前后顺序是按指定路径的前后顺序搜索的。有兴趣的读者本身验证。

PS:此文网上搜得,原始出处已经没法访问,故没法给出原文连接。

相关文章
相关标签/搜索