库文件与头文件

        首先说明库文件与头文件在gcc中的具体使用方法,然后说明两者的区别与联系。

        库文件即库函数,如printf和scanf函数。以libgtdf.so库文件为例(库文件在命名时都以lib开头,因此使用-l选项去链接指定的库文件时可以省略lib三个字母,即-lgtdf),一般库文件如果是放在/lib,/usr/lib,/usr/local/lib目录(库文件的默认目录)下,则无需额外处理,编译链接时-lgtdf会自动找到对应文件不会报错,但是如果不在对应目录,则需要加上-L  所在目录 -lgtdf才能找到对应的库文件。头文件一般是采用源文件中用#include命令包含,头文件如果放在/usr/include目录下则会自动找到不会报错,否则编译链接时需要使用-I  所在目录才能正确找到。头文件不需要具体指定是哪个头文件,因为在源代码文件中#include已经有说明,因此只需要-I参数指明目录即可,但是库文件需要-l参数指定是哪个库文件。例如:g++ test.cpp -o test.txt -L /mytest/lib -lgtdf -I /mytest/include  也等价于: gcc -lstdc++ test.cpp -o test.txt -L /mytest/lib -lgtdf -I /mytest/include     即gcc在编译C++文件时需要加上-lstdc++参数,具体原因可以参考之前的文章。

        #include< > 与 #include“ ” 的区别:尖括号为系统标准库头文件,会自动在/usr/include目录下查找,引号为用户自己定义的头文件,在未指定目录的情况下,会先在当前工作目录内查找,当前工作目录找不到再在/usr/include目录下查找。-I指定目录时,先在指定目录和当前工作目录查找,然后在/usr/include目录下查找。      

        Linux下的库文件分为两大类,分别为动态链接库(.so)和静态链接库(.a),两者的差别仅在于程序执行时所需要的代码是在运行时动态加载的,还是编译时静态加载的。默认情况下,gcc在链接时优先使用动态链接库,只有在动态链接库不存在时,才会使用静态链接库。如果需要的话,可以在编译时加上-static选项,强制使用静态链接库。如在/home/zsx/lib目录内部由libfoo.so 和libfoo.a文件,为了让gcc只用到静态链接库,而不使用动态链接库,则可以:gcc foo.c -L /home/zsx/lib -static -lfoo -o foo         ldd命令用来显示二进制代码文件动态库的链接情况,如:ldd foo  

        头文件是文本文件,是可供阅读的;库文件是二进制文件,不可直接阅读。库文件是将一系列的源文件进行编译打包,形成的二进制文件包,其中封装着函数接口,在编程中可以由其它源文件调用。库文件可分为静态库和动态库两种。

        头文件在编译中使用;库文件在链接中使用。头文件中是函数或定义的声明,及少量内联函数的使用,一般不包含非静态函数实现;库文件中包含函数的实现。头文件是手动编写的,库文件是编译生成的。

        虽然没有规定调用库函数必须引用头文件,但一般约定,当调用库函数的时候需要引用接口函数所在的头文件。

        一个库文件均有一组头文件与其对应。库文件和对应头文件的作者应为同一个。作者必须保证头文件中所声明的函数类型及参数列表,与库文件中的实现是相同的。

        具体来说,头文件中有函数的申明,库文件实现函数的定义。比如,printf函数。使用时应包括stdio.h,打开stdio.h你只能看到,printf这个函数的申明,却看不到printf具体是怎么实现的,而函数的实现在相应的C库中。而库文件一般是以二进制形式而不是C源文件形式提供给用户使用的。程序中包括了stdio.h这个头文件。链接器就能根据头件中的信息找到printf这个函数的实现并链接进这个程序代码段里。总结起来就是,库文件通过头文件向外导出接口。用户通过头文件找到库文件中函数实现的代码从而把这段代码链接到用户程序中去。

  • 4
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值