当前位置: 首页 > Linux

Linux主程序子程序编译链接;makefile编写和tarball程序管理

时间:2023-04-07 01:23:24 Linux

主程序子程序编译和链接主程序hello.c#include?intmain(void)?{?printf("HelloWorld\n");thanks();?}?子程序thanks.c#include?voidthanks(void)?{?printf("Thanks\n");?}?compilegcc-chello.cthanks.c-cis去掉链接,否则主程序在调用感谢线时会报错。-c会同时自动生成hello.o和thanks.o链接gcc-omainhello.othanks.o是在上面的基础上部分编译的,如果我们修改thanks.c,就不需要了全部重新编译,只需要生成新的thanks.o即可与其他目标文件重新链接。省时间。调用动态函数库的时候,记得用pthread写程序。编译时,始终在末尾添加-lpthread选项。这是什么原因?编写程序#include?intmain(){?floatval;?val=sin(3.14/2);?printf("%f\n",val);?}动态链接gcc-omainlib.c-lm-L/lib-L??/usr/libsin()该函数在libm.so函数库中,-lm的含义是:l:表示链接函数库libm:libm。所以在部分之后删除lib等。由此,我们可以认为pthread应该定义在libpthread.so函数库中。-L指定函数库的位置,默认在/lib和/usr/lib,所以不写也没关系。静态函数库和动态函数库静态函数库的扩展名是.a,全称是libxxx.a。这类函数库在编译时会集成到执行程序中。库的更新将导致包含它的所有程序的更新。动态函数库的扩展名是.so,全称是libxxx.so。这类函数只是在编译时添加了一个指向函数库的指针。它只需要在执行时加载。函数库的升级不需要修改其他程序。动态函数库分析lddxxx.o可以分析出程序中涉及了哪些动态函数库。gcc常用选项E:preprocessing,frommain.ctomain.i是加载静态函数库-S:compile,得到xxx.i到xxx.s的汇编语言代码。c:生成机器码.o文件-o:链接,生成可执行文件-O[0:3]:进行不同程度的优化。-std=c99:支持c99标准-std=c++11:支持c++11-Wall:编译更严格-g:生成gdb调试使用make的信息如果我们有很多项目为什么要使用make程序,这些程序相互引用,有些程序还使用动态函数库。那么我们编译的时候,就会分成很多步骤,很麻烦。当我们需要重新编译时,所有的步骤还是要重新做一遍。可以省略吗?maketarget的基本用法:targetfile1targetfile2...gcc-otargetfile1targetfile2还是以上面的hello.c,thanks.c为例,忘了的朋友可以翻页看看。下面是我们的makefile:main:hello.othanks.ogcc-omainhello.othanks.oclean:rm-fhello.othanks.o如你所见,我有两个目标,可以在make中调用选择时:makemainmakeclean其中:main:是生成目标文件main。clean:用于清理生成的冗余目标文件。是必需的,后跟命令。Makefile优化Makefile也可以定义变量,可以简化makefile的写法:OBJS=main.othanks.omain:gcc-o$@${OBJS}clean:rm-f${OBJS}类似bash但有优点不同的是,在变量定义中,'='两边可以有空格。$@代表当前目标,这里是mainTarball软件的安装我们经常需要通过源码来安装软件,那么它们的安装步骤是怎样的呢?./configure:用于生成Makefilemakeclean用于清除之前的目标文件makecompilemakeinstall将编译后的数据安装到默认目录中。