了解如何使用静态库将多个C目标文件组合成一个可执行文件。用C编写的应用程序代码通常有多个源文件,但最终您需要将它们编译成一个可执行文件。您可以通过两种方式做到这一点:创建静态库或动态库(也称为共享库)。这两种类型的库在创建和链接方式上有所不同。您选择使用哪个取决于您的用例。在本文中,我解释了如何创建静态链接的可执行文件。将链接器与静态库一起使用链接器是组合程序的各个部分并重新组织其内存分配的命令。链接器的功能包括:整合程序的所有部分找到一个新的内存组织将所有部分放在一起恢复地址以便程序可以在新的内存组织下运行解析符号引用作为所有这些链接器功能的结果,一个可运行的创建称为可执行文件的程序。通过将程序中使用的所有必需的库模块复制到最终的可执行映像中来创建静态库。链接器链接静态库是编译过程的最后一步。可执行文件是通过解析外部引用并将库例程与程序代码相结合来创建的。创建目标文件下面是静态库和链接过程的示例。首先,使用以下函数签名创建头文件mymath.h:intadd(inta,intb);intsub(inta,intb);intmult(inta,intb);intdivi(inta,intb);创建add.c、sub.c并使用以下函数定义:mult.cdivi.c//add.cintadd(inta,intb){return(a+b);}//sub.cintsub(inta,intb){return(a-b);}//mult.cintmult(inta,intb){return(a*b);}//divi.cintdivi(inta,intb){return(a/b);}现在生成目标文件add.o,sub.o,mult.o,divi.o,并使用GCC:linuxmi@linuxmi/home/linuxmi/www.linuxmi.com?gcc-cadd.csub.cmult.cdivi.c-c选项跳过链接步骤,只创建目标文件。创建一个名为libmymath.a的静态库,并删除不再需要的目标文件。(注意使用trash命令比rm命令更安全。)linuxmi@linuxmi/home/linuxmi/www.linuxmi.com?arrslibmymath.aadd.osub.omult.odivi.o$trash*o$lsadd.cdivi.clibmymath.amult.cmymath.hsub.c您现在已经创建了一个名为libmymath的简单示例数学库,您可以在C代码中使用它。当然,那里有非常复杂的C库,他们的开发人员使用这些库来生产您和我安装以在C代码中使用的最终产品。接下来,在一些自定义代码中使用您的数学库,然后链接到它。创建静态链接的应用程序假定您编写数学命令。创建一个名为mathDemo.c的文件并将以下代码粘贴到其中:#include#include#includeintmain(){intx,y;printf("请输入两个数\n");scanf("%d%d",&x,&y);printf("\n%d+%d=%d",x,y,添加(x,y));printf("\n%d-%d=%d",x,y,sub(x,y));printf("\n%d*%d=%d",x,y,mult(x,y));if(y==0){printf("\n分母为零所以不能进行除法\n");退出(0);}else{printf("\n%d/%d=%d\n",x,y,divi(x,y));返回0;}}请注意,第一行是include语句,它按名称引用您自己的libmymath库。从mathDemo.c创建一个名为mathDemo.o的目标文件:linuxmi@linuxmi/home/linuxmi/www.linuxmi.com?gcc-I。-cmathDemo.c-I选项告诉GCC搜索以下头文件。在这种情况下,您要指定当前目录,用点(.)表示。将mathDemo.o与libmymath.a链接起来以创建最终的可执行文件。有两种方法可以向GCC表达这一点。您可以指向文件:linuxmi@linuxmi/home/linuxmi/www.linuxmi.com?gcc-static-omathDemomathDemo.olibmymath.a或者,您可以指定库路径以及库名称:linuxmi@linuxmi/home/linuxmi/www.linuxmi.com?gcc-static-omathDemo-L。mathDemo.o-lmymath在后一个示例中,-lmymath选项告诉链接器将现有目标文件libmymath.a与目标文件mathDemo.o链接起来,以创建最终的可执行文件。-L选项指示链接器在以下参数中查找库(类似于您将使用的-I)。分析结果使用file命令确认是静态链接:linuxmi@linuxmi/home/linuxmi/www.linuxmi.com?filemathDemomathDemo:ELF64-bitLSBexecutable,x86-64,version1(GNU/Linux),staticlylinked,BuildID[sha1]=c43a2cdedc68087433caf94b67ae079a02bc0bc9,forGNU/Linux3.2.0,未剥离使用ldd命令查看可执行文件没有动态链接:linuxmi@linuxmi/home/linuxmi/www.linuxmi.com?ldd./mathDemo不是动态可执行文件您还可以检查可执行文件mathDemo的大小:linuxmi@linuxmi/home/linuxmi/www.linuxmi.com?du-h./mathDemo984K./mathDemo运行命令以查看它是否正常工作:linuxmi@linuxmi/home/linuxmi/www.linuxmi.com?./mathDemo输入两个数字20520+5=2520-5=1520*5=10020/5=4何时使用静态链接动态链接的可执行文件通常比静态链接的可执行文件更好是首选,因为动态链接使应用程序的组件保持模块化。如果库收到重要的安全更新,可以很容易地对其进行修补,因为它存在于使用它的应用程序之外。当您使用静态链接时,库的代码“隐藏”在您创建的可执行文件中,这意味着修补它的唯一方法是每次库获得更新时重新编译和重新分发新的可执行文件——您有更好的事情要做用你的时间,相信我。但是,如果库的代码与使用它的可执行文件存在于相同的代码库中,或者存在于预计不会接收更新的专用嵌入式设备中,则静态链接是一个合理的选择。