gcc指定头文件路径及动态链接库路径
本文详细介绍了linux 下gcc头文件指定方法,以及搜索路径顺序的问题。另外,还总结了,gcc动态链接的方法以及路径指定,同样也讨论了搜索路径的顺序问题。本文包含了很多的例子,具有很强的操作性,希望读者自己去走一遍。
一.#include <>与#include “”
#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联合使用,明确限定头文件的位置。
在编译驱动模块时,由于非凡的需求必须强制GCC不搜索系统默认路径,也就是不搜索/usr/include要用参数-nostdinc,还要自己用-I参数来指定内核头文件路径,这个时候必须在Makefile中指定。
头文件搜索顺序:
1.由参数-I指定的路径(指定路径有多个路径时,按指定路径的顺序搜索)
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/include
库文件,但是如果装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。
在上述1、2、3指定动态库搜索路径时,都可指定多个动态库搜索路径,其搜索的先后顺序是按指定路径的先后顺序搜索的。有兴趣的读者自己验证。
PS:此文网上搜得,原始出处已经无法访问,故无法给出原文链接。
转自:http://wdqfirst.blog.163.com/blog/static/1133474112012108114838299/
分享到:
相关推荐
- **修改环境变量**:可以通过设置`LD_LIBRARY_PATH`和`LIBRARY_PATH`环境变量来指定动态链接库和静态链接库的搜索路径。 ```bash # 动态链接库搜索路径 export LD_LIBRARY_PATH=自定义路径:$LD_LIBRARY_PATH ...
7. **系统路径和LD_LIBRARY_PATH**:Linux系统在查找动态链接库时,会检查默认的系统库路径(如/lib和/usr/lib)以及环境变量`LD_LIBRARY_PATH`指定的路径。如果库不在这些路径中,需要将库复制到相应目录或修改环境...
动态链接库的使用还涉及到环境变量`LD_LIBRARY_PATH`,这是一个指定动态连接器在运行时查找动态库路径的变量。如果动态库不在标准库路径中,可以通过设置`LD_LIBRARY_PATH`来指定。此外,对于有root权限的用户,也...
配置OpenGL开发环境通常涉及到安装必要的头文件、类库包以及动态链接库文件。下面我们将详细介绍这些组成部分。 1. **头文件**: 头文件在C++编程中用于包含函数声明和类型定义,对于OpenGL而言,主要包括以下几个...
- **路径问题**:确保动态链接库文件位于系统搜索路径中,或者直接通过`System.load()`指定完整路径。 - **兼容性**:不同平台下的动态链接库可能不兼容,因此可能需要为不同的操作系统分别编译。 - **资源管理**:...
1. **修改 `/etc/ld.so.conf` 文件**:在该文件中添加动态链接库所在的目录路径,然后执行 `ldconfig` 命令更新链接器缓存。 2. **设置环境变量 `LD_LIBRARY_PATH`**:这是一个更灵活的方法,可以在不修改系统配置...
- 示例:`gcc main.o -L/path/to/lib -lfoo`,此命令会在指定路径中查找库。 通过以上对GCC参数的详细介绍,我们可以更好地理解如何使用GCC来进行高效的编译和链接工作。无论是对于初学者还是高级用户来说,掌握...
3. 在源代码中使用`#include`引入库头文件,并在编译时使用`-L`指定库路径,`-l`指定链接库名,如`-L/path/to/library -lmylib`。同时,可能需要在链接时添加`-ldl`选项,以支持动态链接。 三、使用静态和动态链接...
接着,我们可以使用GCC编译`main.c`并链接动态库: ``` gcc main.c -L. -lmyhello -o main ``` 最后,运行`main`程序验证动态库是否被正确加载。 ``` ./main ``` #### 四、总结 通过以上步骤,我们成功地创建了...
或者在编译时指定动态库路径: ```bash gcc -o hello main.c -L. -lmyhello -Wl,-rpath=. ``` 至此,我们已经完成了使用GCC生成静态库和动态库的全过程。通过这个示例,我们可以看到静态库和动态库各自的特点和...
- **第二步**:使用 `gcc` 编译成动态链接库文件(`.so` 文件)。 ```shell gcc -shared -o libmyhello.so hello.o ``` ##### 4. 使用动态链接库 使用动态链接库的过程与静态链接库相似,但有一些细微差别需要...
#### 三、gcc环境中头文件和库文件路径指定 在编译过程中,gcc需要知道如何找到必要的头文件和库文件。以下列出了gcc搜索这些文件的顺序: 1. **通过-I选项指定的目录**:这是最优先的搜索位置。 2. **gcc的环境...
在其他程序中使用动态链接库,需要包含对应的头文件(`#include "datetime.h"`),并且在链接时指定动态链接库。例如,如果有一个`main.c`程序想要使用`my.so`库,编译时需要添加`-rdynamic`和`-ldl`选项: ``` ...
在程序中使用动态链接库,需要`-l`选项指定库名,例如`gcc test.c -ladd`。如果需要在运行时动态加载,需要包含`<dlfcn.h>`头文件,使用`dlopen()`加载库,`dlsym()`获取函数地址。 在不同环境下,如交叉编译,可能...
3. **编译动态链接库**:使用`gcc`编译器,添加`-fPIC`标志生成位置无关代码(Position-Independent Code),这是创建动态链接库的必要条件。再使用`-shared`标志生成共享对象文件,最后指定输出文件名,例如`gcc -...
在Linux系统中,链接库是实现程序功能复用的关键组件,分为静态链接库和动态链接库两种类型。本文主要探讨这两种库的创建、使用及其特点。 1. 静态函数库 静态库通常以`.a`为后缀,如`libxxx.a`。在编译过程中,...
- 使用 `gcc` 的 `-shared` 参数来编译源代码,生成动态链接库,如 `libtu.so`。 - 创建 `g2.sh` 脚本来编译程序,并使用 `-l` 参数指定链接动态库。 - 因为动态库不在默认的搜索路径中,所以需要通过设置 `LD_...
程序首先包含必要的头文件,并定义了一些宏和常量,比如`SOFILE`用于指定动态链接库的路径。 ```c #include #include #include #define SOFILE "./my.so" #define SHARED #include "datetime.h" int main() { ...
3. **创建库**:接下来,使用`gcc`的`-shared`选项,结合`-o`指定输出文件名,创建动态链接库。例如: ``` gcc -shared -o libmyfunc.so libmyfunc.o ``` 4. **设置版本号**:如果需要,可以为库设置版本号,...