从源码编译安装软件一般情况下,如果我们在linux下运行一个软件,我们需要先安装它。比如运行PHP软件,可以使用apt-getinstallphp命令安装,或者编译安装PHP的源代码,然后运行。下面主要讲一下源码编译安装。首先,php源码是用C语言写的,但是C语言是高级语言,机器无法识别C语言代码。现在需要将C语言代码翻译成Linux能看懂的二进制文件(binaryfile)。这个翻译工作需要编译器来完成。在编译过程中,还会生成所谓的目标文件,这些文件以.o的文件名存在。对于C源代码文件,使用.c作为存储文件。有时我们需要在程序中调用其他外部子程序,或者调用其他套件提供的函数,但是在编译过程中添加函数库是非常有必要的,这样编译器就可以编译出程序中所有的代码和函数库作为连接(Link)生成正确的执行文件(linux核心提供了很多核心相关的函数库和外部参数,大部分存放在/usr/include、/lib、/usr/lib)后编译器编译后,会有一个二进制文件。如果要编译的程序是nginx、apache等大型软件的源程序,用gcc一条条输入编译指令是不现实的。可以使用make命令,make会在当前目录下找到Makefile(或makefile)文件,makefile文件记录了源代码如何编译的详细信息。通常,软件开发者会编写一个检测序列来检测用户的操作环境,以及该操作环境是否具有软件开发者需要的其他功能,检测程序完成检测后,会主动创建makefile的规则文件.通常检测程序文件的名称为configure或config。所以一般先执行configure检测运行环境,生成makefile,再执行make编译。例如:cdphp-5.5.10/./configure--prefix=/usr/local/php--with-config-file-path=/etc/php--enable-fpm--enable-pcntl--enable-mysqlnd--enable-opcache--enable-sockets--enable-sysvmsg--enable-sysvsem--enable-sysvshm--enable-shmop--enable-zip--enable-ftp--enable-soap--enable-xml--enable-mbstring--disable-rpath--disable-debug--disable-fileinfo--with-mysql=mysqlnd--with-mysqli=mysqlnd--with-pdo-mysql=mysqlnd--with-pcre-正则表达式--with-iconv--with-zlib--with-mcrypt--with-gd--with-openssl--with-mhash--with-xmlrpc--with-curl--with-imap-sslsudomakesudomakeinstallsudocpphp.ini-development/etc/php/makefile.am文件分析下面是memcached的makefile.am文件内容:#表示指定要生成的可执行应用程序文件,意思是在安装到系统中时需要安装可执行文件。程序知道这是一个可执行文件。client代表编译后的目标文件。bin表示目录文件安装到系统的目录。bin_PROGRAMS=memcachedpkginclude_HEADERS=protocol_binary.h#表示指定要生成的可执行应用程序文件,只想编译,不想安装到系统中cutil.htimedrun_SOURCES=timedrun.c#表示用于生成可执行应用程序的源文件,其中main()函数在memcached.c中h\murmur3_hash。cmurmur3_hash.h\slabs.cslabs.h\items.citems.h\assoc.cassoc.h\thread.cdaemon.c\stats.cstats.h\util.cutil.h\trace.hcache.hsasl_defs.h\bipbuffer.cbipbuffer.h\logger.clogger.h\crawler.ccrawler.h\itoa_ljust.citoa_ljust.h#BUILD_CACHE定义在configure.ac中,需要额外编译源文件如果建立_CACHEmcached_SOURCES+=cache.ctestapp_SOURCES+=cache.cendif#BUILD_SOLARIS_PRIVS在configure.ac中定义,需要额外编译所需的源文件如果BUILD_SOLARIS_PRIVSmemcached_SOURCES+=solaris_priv.cendif#ENABLE_SASL在configure.ac中定义,需要额外编译需要源码fileifENABLE_SASLmemcached_SOURCES+=sasl_defs.cendif#memcached_debug使用的编译源文件和memcached一样memcached_debug_SOURCES=$(memcached_SOURCES)#这个和Makefile文件中一样,表示C语言预处理器参数。DCONFIG_DIR在这里指定。程序中,可以直接使用CONFIG_DIR,不要把这个和另一个CFLAGS搞混了,意思是编译器参数memcached_CPPFLAGS=-DNDEBUG#连接需要的库文件CLEANFILES=ifBUILD_DTRACEBUILT_SOURCES+=memcached_dtrace.hCLEANFILES+=memcached_dtrace.hendififDTRACE_INSTRUMENT_OBJmemcached_LDADD+=memcached_dtrace.omemcached_DEPENDENCIES+=memcached_dtrace.omemcached_debug_LDADD+=memcached_debug_dtrace.omemcached_debug_DEPENDENCIES+=memcached_debug_dtrace.oCLEANFILES+=memcached_dtrace.omemcached_debug_dtrace.oendifmemcached_dtrace.h:memcached_dtrace.d${DTRACE}-h-smemcached_dtrace.dsed-e's,void\*,constvoid\*,g'memcached_dtrace.h|\sed-e's,char\*,constchar\*,g'|tr'\t'''>mmc_dtrace.tmpmvmmc_dtrace.tmpmemcached_dtrace.hmemcached_dtrace.o:$(memcached_OBJECTS)$(DTRACE)$(DTRACEFLAGS)-G-omemcached_dtrace.o-s${srcdir}/memcached_dtrace.d$(memcached_OBJECTS)memcached_debug_dtrace.o:$(memcached_debug_OBJECTS)$(DTRACE)$(DTRACEFLAGS)-G-omemcached_debug_dtrace.o-s${srcdir}/memcached_dtrace.d$(memcached_debug_OBJECTS)SUBDIRS=docDIST_dtrace=脚本memcached.specmemcached_dtrace.dversion.m4README.mdLICENSE.bipbufferMOSTLYCLEANFILES=*.gcov*.gcno*.gcda*.tcovtest:memcached-debugsizestestapp$(srcdir)/sizes$(srcdir)/testapp证明$(srcdir)/t@iftest`basename$(PROFILER)`="gcov";然后\用于memcached_debug-*.gc中的文件??;做\mv-f$$file`echo$$file|sed's/memcached_debug-//'`;\done&&\forfilein*.gcda;做\srcfile=`echo$$file|sed's/.gcda/.c/'`;\iftest-n"`echo$(memcached_debug_SOURCES)|grep$$srcfile`";然后\echo`$(PROFILER)$$srcfile`|sed's/'$$srcfile':.*//';\fi\done\eliftest`basename$(PROFILER)`="tcov";然后\files=`grepSRCFILEmemcached-debug.profile/tcovd|sed's/SRCFILE://'|排序|uniq`&&\$(PROFILER)-xmemcached-debug.profile$$files2>&1;\用于*.tcov中的文件;做\srcfile=`echo$$file|sed's/.tcov//'`;\iftest-n"`echo$(memcached_debug_SOURCES)|grep$$srcfile`";then\echo$$srcfile:`grep'执行文件的百分比'$$file`;\fi\done\else:;fidocs:(catDoxyfile;echo"PROJECT_NUMBER=`catversion.num`")|氧气-dist-hook:rm-f$(distdir)/*/*~$(distdir)/t/lib/*~$(distdir)/*~maintainer-clean-local:-rmMakefile.in-rmaclocal.m4-rmconfig.guess-rmconfig.sub-rmdepcomp-rminstall-sh-rmltmain.sh-rmmissing-rmconfigure-rmconfig.log-rmconfig.status参考资料:《鸟哥的Linux私房菜》http://blog.csdn.net/zmxiangd...
