热搜:前端 nest neovim nvim

库和头文件(库头文件可以打开看吗)

lxf2023-06-02 07:45:01

在linux中,库与头文件的联系:头文件中有函数的声明,库文件实现函数的定义;库中的每个函数都需要在头文件中声明。编写程序时,需要用头文件提供常量定义和系统函数和库函数调用声明;图书馆是一组编译函数的集合,即目标文件“.o“集合是按照可重用的原则编写的,通常由一组相关的函数组成,以执行一项常见的任务。

库和头文件(库头文件可以打开看吗)

本教程操作环境:linux7.3系统、Dell G3电脑。

在一般应用程序源代码中,头文件中有函数声明,库文件实现函数的定义;库中的每个函数都需要在头文件中声明。

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代表静态函数库,.所代表共享函数库(即windows下的DLL动态链接库)。

gcc -o fred fred.c /usr/lib/libm.agcc -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函数编译.以及之前生成的billl.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.生成共享库liboofoooooo.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可用于分析可执行文件运行所需的共享库

库和头文件(库头文件可以打开看吗)

也可以在编译目标代码时指定目标代码.通过gcccccco库的搜索路径, 的参数-Wl,-rpath指定,如gcc main.cpp -lfoo -L. -Wl,-rpath=.-Wl, 表示后面的参数将传输给 link 程序 ld (因为 gcc 会自动调用ld )指定多个动态库搜索路径时,路径之间使用冒号