Linux平台gcc编译运行时头文件或动态链接库的查找

来源:互联网 发布:网络金融销售是传销吗 编辑:程序博客网 时间:2024/05/21 03:57
 我们在写一个比较大型的程序时,总是喜欢把一些函数还有一些数据结构的声明放在一个文件中,我们把这种文件称为头文件,文件名以.h后缀结尾。在一些源文件里,我们可能要包含自己写的头文件,还有一些标准库的头文件比如说stdio.h等等。在编译的预处理阶段,预处理程序会将这些头文件的内容插到相应的include指令处,现在的问题是编译器是如何找到这些头文件的。

     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
原创粉丝点击