共计 2166 个字符,预计需要花费 6 分钟才能阅读完成。
本篇内容介绍了“在 linux 中库与头文件的联系是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让丸趣 TV 小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!
在 linux 中库与头文件的联系:头文件中有函数的申明,库文件实现函数的定义;库中的每个函数都需要在头文件中加以声明。在写程序时,需要用头文件来提供对常量的定义和对系统函数及库函数调用的声明;而库是一组已经编译好的函数的集合,也就是目标文件“.o”的集合,是按照可重用的原则编写的,一般由一组互关联的函数组成以执行某项常见任务。
在一般应用程序源代码中,头文件中有函数的申明,库文件实现函数的定义;库中的每个函数都需要在头文件中加以声明。
1. 头文件
在写程序时,我们需要用头文件来提供对常量的定义和对系统函数及库函数调用的声明,这些头文件位于 /usr/include 中。这些头文件都位于可以被编译器自动搜索到的目录中,如 X 视窗系统的 /usr/include/X11 和 GNU C++ 的 /usr/include /c++。
在调用 gcc 时,可以使用标志 - I 来包含保存在子目录或其它非标准位置中的头文件,例如 gcc -I/usr/openwin/include fred.c
2. 库文件
库是一组已经编译好的函数的集合,也就是目标文件.o 的集合,是按照可重用的原则编写的,一般由一组互关联的函数组成以执行某项常见任务。
标准 linux 系统库文件一般存储在 /lib 和 /usr/lib 目录中。默认情况下 GCC 的链接程序只搜索标准 C 语言库,这是一个历史遗留问题。我们必须使库文件名遵守特定的规范并在命令行中加以指定。
库文件总以 lib 开头,然后指出这是什么库,最后的部分.a 代表静态函数库,.so 代表共享函数库(即 windows 下的 DLL 动态链接库)。
如 gcc -o fred fred.c /usr/lib/libm.a 或 gcc -o fred fred.c -lm
- L 标志为链接器增加库的搜索路径,如 gcc -o x11fred -L /usr/openwin/lib x11fred.c -1X11
2.1 静态库
静态库以.a 结尾,也称作归档文件,在生成可执行程序时,静态库文件就被链接进去,生成的可执行文件较大,可以脱离静态库文件运行。
2.1.1 生成方法
首先创建两个源文件 fred.c 和 bill.c
然后用 gcc - c 编译生成两个目标文件
然后为这两个函数编写头文件,进行函数声明
然后在 main 函数中包含头文件并调用其中一个库函数
然后编译 main 函数并将 main.o 和之前生成的 bill.o 链接,可以正确执行
接下来我们生成库文件,用 ar 归档程序创建归档文件并将目标文件添加进去,它可将若干单独的文件归并到一个大的文件中。ar crv libfoo.a bill.o fred.o 之后我们要用 ranlib 命令为函数库生成一个内容表。
然后我们将库文件和之前生成的 program.o 文件链接起来, 执行成功
也可以用 - l 指定函数库,并用 - L 指定非标准位置。
我们可以用 nm 命令查看哪些函数被包含在目标文件,函数库或可执行文件中,可用于反汇编分析。程序被创建时它只包含函数库中它所实际需要的函数,虽然头文件中有所有函数的声明,但链接器并不会将它们全部链接进去。
静态库 Linux 与 Windows 的比较
2.2 共享库
当同时运行许多应用程序并且他们中都使用来自同一个函数库的函数时,内存中会有同一个函数的许多副本,浪费内存和外存!!当程序使用函数库时,它本身在链接时不再包含函数代码,而是引用运行时可访问的共享代码,当编译好的程序被装载到内存中执行时,函数引用被解析并产生对共享库的调用,如果有必要,共享库才被加载到内存中。即系统可以只在内存中保留共享库的一份副本供许多应用程序调用,在外存上也可只保留一份。而且共享库的更新也可以独立于依赖它的应用程序,应用程序不需再重新编译。
在 linux 系统中,负责装载共享库并解析客户程序引用的函数的程序(动态装载器)是 ld.so
2.2.1 生成方法
用中间文件 bill.o fred.o 生成共享库 libfoo.so gcc -shared -fpic -o libfoo.so bill.o fred.o
生成了共享库后,要置于标准搜索目录下。搜索共享库的额外位置可以在文件 /etc/ld.so.conf 中配置,修改这个文件后执行命令 ldconfig 来处理。
/etc/ld.so.conf 的内容为 include /etc/ld.so.conf.d/*.conf,在此目录下建立自己的动态链接库路径配置文件 mylib.conf
然后指定搜索路径
链接生成可执行文件 gcc -o main program.o -lfoo -L.
ldd 工具可用来分析可执行文件运行所需要的共享库
也可以在编译目标代码时指定.so 库的搜索路径,通过 gcc 的参数 -Wl,-rpath 指定,如 gcc main.cpp -lfoo -L. -Wl,-rpath=.-Wl, 表示后面的参数将传给 link 程序 ld(因为 gcc 会自动调用 ld)当指定多个动态库搜索路径时,路径之间用冒号:分隔。
“在 linux 中库与头文件的联系是什么”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注丸趣 TV 网站,丸趣 TV 小编将为大家输出更多高质量的实用文章!