Linux平台gcc编译运行时头文件或动态链接库的查找
来源:互联网 发布:网络金融销售是传销吗 编辑:程序博客网 时间:2024/05/21 03:57
我们在写一个比较大型的程序时,总是喜欢把一些函数还有一些数据结构的声明放在一个文件中,我们把这种文件称为头文件,文件名以.h后缀结尾。在一些源文件里,我们可能要包含自己写的头文件,还有一些标准库的头文件比如说stdio.h等等。在编译的预处理阶段,预处理程序会将这些头文件的内容插到相应的include指令处,现在的问题是编译器是如何找到这些头文件的。
可以把test.h放在与main.c同一个目录下,编译命令如下:gcc -o main main.c -l ./
而如果用gcc编译的话: gcc -o main main.c 提示如下:main.c:2:19: 致命错误: test.h:没有那个文件或目录
编译中断。
现在我们把test.h文件放在include文件中,编译命令如下:
thinkpad@thinkpad:~/C_Pro/tftest$ gcc -o main main.c -I /home/thinkpad/C_Pro/tftest/include/
如此便可以找到头文件了,当然如果头文件比较多的话都可以放在include的文件夹内。
这里可以简单记一下命令:gcc -o 可执行文件 源文件 -I 路径
hello.c是我们的动态共享库,在hello.c里面我们声明和实现了各种公用的函数,最后main.c可以去调用这些公用函数。首先我们要把hello.c编译成为动态共享库:
thinkpad@thinkpad:~/C_Pro/linkpath$ gcc -o libhello.so -shared -fPIC hello.c
-fPIC参数声明链接库的代码段是可以共享的,-shared参数声明编译为共享库。请注意这次我们编译的共享库的名字叫做libhello.so,这也是Linux共享库的一个命名的惯例了:后缀使用so,而名称使用libxxxx格式。
然后编译main.c的时候,我们需要更多的参数让gcc知道如何寻找共享库:
thinkpad@thinkpad:~/C_Pro/linkpath$ gcc -o main main.c -L ./ -lhello
-L参数指定到哪个附加路径下面去寻找共享库,现在我们指定在当前目录下面寻找;----路径的意思
-l参数指定链接到哪个共享库上面,我们传的参数hello,那么gcc就会自动链接到libhello.so这个共享库上面(注意我们上面说的libXXXX.so命名规则);----l链接到某个文件的意思。
-I参数指定到哪个附加路径下面去寻找h文件,这个我们没有使用。-----这个是寻找头文件的时候使用的。
最后我们成功编译好了main,执行一下,报错:
./main: error while loading shared libraries: libhello.so: cannot open shared object file: No such file or directory
为什么会这样呢 ?
找不到libhello.so这个共享库,怎么回事?这是因为libhello.so并不在操作系统默认的共享库的路径下面,我们可以临时指定一下链接路径:
export LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH 也可以直接修改环境变量
这样就成功了。我们用ldd main看一下:
1. 在编译时,我们可以用-I(i的大写)选项来指定头文件所在的目录,如:test.h
Struct student { int age; }; main.c 内容如下 #include<stdio.h> #include<test.h> int main() { structstudent st; st.age= 25; printf(“st.age=%d\n”,st.age); return0; }
可以把test.h放在与main.c同一个目录下,编译命令如下:gcc -o main main.c -l ./
而如果用gcc编译的话: gcc -o main main.c 提示如下:main.c:2:19: 致命错误: test.h:没有那个文件或目录
编译中断。
现在我们把test.h文件放在include文件中,编译命令如下:
thinkpad@thinkpad:~/C_Pro/tftest$ gcc -o main main.c -I /home/thinkpad/C_Pro/tftest/include/
如此便可以找到头文件了,当然如果头文件比较多的话都可以放在include的文件夹内。
这里可以简单记一下命令:gcc -o 可执行文件 源文件 -I 路径
--------------------------------
2.链接动态库
GNU gcc的编译工具用法
编写hello.的文件,
#include <stdio.h>void print_hello() { printf("Hello World\n");}
hello.c是我们的动态共享库,在hello.c里面我们声明和实现了各种公用的函数,最后main.c可以去调用这些公用函数。首先我们要把hello.c编译成为动态共享库:
thinkpad@thinkpad:~/C_Pro/linkpath$ gcc -o libhello.so -shared -fPIC hello.c
-fPIC参数声明链接库的代码段是可以共享的,-shared参数声明编译为共享库。请注意这次我们编译的共享库的名字叫做libhello.so,这也是Linux共享库的一个命名的惯例了:后缀使用so,而名称使用libxxxx格式。
然后编译main.c的时候,我们需要更多的参数让gcc知道如何寻找共享库:
thinkpad@thinkpad:~/C_Pro/linkpath$ gcc -o main main.c -L ./ -lhello
-L参数指定到哪个附加路径下面去寻找共享库,现在我们指定在当前目录下面寻找;----路径的意思
-l参数指定链接到哪个共享库上面,我们传的参数hello,那么gcc就会自动链接到libhello.so这个共享库上面(注意我们上面说的libXXXX.so命名规则);----l链接到某个文件的意思。
-I参数指定到哪个附加路径下面去寻找h文件,这个我们没有使用。-----这个是寻找头文件的时候使用的。
最后我们成功编译好了main,执行一下,报错:
./main: error while loading shared libraries: libhello.so: cannot open shared object file: No such file or directory
为什么会这样呢 ?
找不到libhello.so这个共享库,怎么回事?这是因为libhello.so并不在操作系统默认的共享库的路径下面,我们可以临时指定一下链接路径:
export LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH 也可以直接修改环境变量
这样就成功了。我们用ldd main看一下:
linux-gate.so.1 => (0xb77a4000)libhello.so => ./libhello.so (0xb779f000)libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb75e5000)/lib/ld-linux.so.2 (0xb77a5000)
0 0
- Linux平台gcc编译运行时头文件或动态链接库的查找
- 程序编译、链接、运行时头文件或动态链接库的查找
- 程序编译运行时头文件或动态链接库的查找---一篇非常好的文章
- 程序编译运行时头文件或动态链接库的查找
- 程序编译运行时头文件或动态链接库的查找
- 程序编译运行时头文件或动态链接库的查找
- 程序编译运行时头文件或动态链接库的查找
- 程序编译运行时头文件或动态链接库的查找
- 程序编译运行时头文件或动态链接库的查找
- 程序编译运行时头文件或动态链接库的查找
- 程序编译运行时头文件或动态链接库的查找
- 程序编译运行时头文件或动态链接库的查找
- 程序编译运行时头文件或动态链接库的查找
- 在linux gcc 64位平台编译动态链接库时出现的问题
- linux下g++ 编译时动态库和静态库的链接和头文件问题
- Linux下gcc编译生成动态链接库*.so文件
- gcc编译链接时头文件和库文件的搜索顺序
- gcc编译链接时头文件和库文件的搜索顺序
- android基础问题
- HTML5物理游戏开发 - 越野山地自行车(一)建立各式各样的地形
- 最近特别没精神····
- HDOJ 1021 Fibonacci Again
- ZOJ-3295
- Linux平台gcc编译运行时头文件或动态链接库的查找
- codevize应用
- tiny6410裸机实验第1章--------------ARM汇编和编程基础(C与ARM汇编混合编程)
- SDUT 1232 / POJ 1785 Binary Search Heap Construction
- access 与 trunk
- 字符串逆序输出(水)
- 初来乍到 人生第一篇
- C堆栈实现
- DSP程序开发与优化经验之四:TMS320C64x+ DSP------Using Cache