通常狀況下,若是咱們在linux下運行一個軟件的話,須要先安裝。好比運行PHP軟件的話,可使用apt-get install php命令安裝,或者編譯安裝php的源碼,而後運行。
如今這裏主要講源碼編譯安裝
首先php源碼是由c語言編寫的,可是C語言是高級語言,機器沒法識別C語言代碼。如今須要將C語言代碼翻譯成Linux能看懂的binary file(二進制文件),這個翻譯工做須要由編譯器來完成翻譯。
在編譯過程當中,還有產生所謂的目標文件(Object file),這些文件以 .o的附文件名存在。至於C的源碼文件則以 .c做爲存儲文件。有時候咱們須要在程序中調用其餘外部子程序,或者調用其餘的套件提供的函數功能,只是很須要在編譯過程當中,將該函式庫都加進來,這樣,編譯器就能夠將全部的程序代碼與函式庫做爲一個鏈接(Link)以產生正確的執行檔
(linux核心提供了不少核心相關的函式庫與外部和參數,這些信息大多放在/usr/include,/lib,/usr/lib)
編譯器翻譯完成以後就有了二進制文件 若是被編譯的程序是大型軟件好比nginx,apache之類的源程序,使用gcc一條條編譯指令輸入的話不現實。 可使用make命令,make會在當前目錄中找到Makefile(或者makefile)文件,makefile文件中記錄了源碼如何編譯的詳細信息 makefile文件一般是,軟件開發商都會寫一個偵測測序來偵測使用者的做業環境,以及該做業環境是否有軟件開發商所須要的其餘功能,該偵測程序 偵測完畢後,就會主動創建這個makefile的規則檔案。一般這個偵測程序文件名爲configure或者config。
因此通常都是先執行 configure檢測做業環境,生成makefile,而後再執行make進行編譯。例如:php
cd php-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-regex --with-iconv --with-zlib --with-mcrypt --with-gd --with-openssl --with-mhash --with-xmlrpc --with-curl --with-imap-ssl sudo make sudo make install sudo cp php.ini-development /etc/php/
下面是memcached的makefile.am文件內容:mysql
# 表示指定要生成的可執行應用程序文件,這表示可執行文件在安裝時須要被安裝到系統中。PROGRAMS知道這是一個可執行文件。client表示編譯的目標文件。bin表示目錄文件被安裝到系統的目錄。 bin_PROGRAMS = memcached pkginclude_HEADERS = protocol_binary.h # 表示指定要生成的可執行應用程序文件,只是想編譯,不想被安裝到系統中 noinst_PROGRAMS = memcached-debug sizes testapp timedrun BUILT_SOURCES= testapp_SOURCES = testapp.c util.c util.h timedrun_SOURCES = timedrun.c # 表示生成可執行應用程序所用的源文件,其中main()函數在memcached.c中 memcached_SOURCES = memcached.c memcached.h \ hash.c hash.h \ jenkins_hash.c jenkins_hash.h \ murmur3_hash.c murmur3_hash.h \ slabs.c slabs.h \ items.c items.h \ assoc.c assoc.h \ thread.c daemon.c \ stats.c stats.h \ util.c util.h \ trace.h cache.h sasl_defs.h \ bipbuffer.c bipbuffer.h \ logger.c logger.h \ crawler.c crawler.h \ itoa_ljust.c itoa_ljust.h # BUILD_CACHE在configure.ac中有定義,須要額外增長編譯所需源文件 if BUILD_CACHE memcached_SOURCES += cache.c testapp_SOURCES += cache.c endif # BUILD_SOLARIS_PRIVS在configure.ac中有定義,須要額外增長編譯所需源文件 if BUILD_SOLARIS_PRIVS memcached_SOURCES += solaris_priv.c endif # ENABLE_SASL在configure.ac中有定義,須要額外增長編譯所需源文件 if ENABLE_SASL memcached_SOURCES += sasl_defs.c endif # memcached_debug使用的編譯源文件和memcached同樣 memcached_debug_SOURCES = $(memcached_SOURCES) # 這和Makefile文件中同樣,表示C語言預處理器參數,這裏指定了DCONFIG_DIR,之後在程序中,就能夠直接使用CONFIG_DIR,不要把這個和另外一個CFLAGS混淆,後者表示編譯器參數 memcached_CPPFLAGS = -DNDEBUG # 鏈接時所須要的庫文件 memcached_debug_LDADD = @PROFILER_LDFLAGS@ memcached_debug_CFLAGS = @PROFILER_FLAGS@ memcached_LDADD = memcached_DEPENDENCIES = memcached_debug_DEPENDENCIES = CLEANFILES= if BUILD_DTRACE BUILT_SOURCES += memcached_dtrace.h CLEANFILES += memcached_dtrace.h endif if DTRACE_INSTRUMENT_OBJ memcached_LDADD += memcached_dtrace.o memcached_DEPENDENCIES += memcached_dtrace.o memcached_debug_LDADD += memcached_debug_dtrace.o memcached_debug_DEPENDENCIES += memcached_debug_dtrace.o CLEANFILES += memcached_dtrace.o memcached_debug_dtrace.o endif memcached_dtrace.h: memcached_dtrace.d ${DTRACE} -h -s memcached_dtrace.d sed -e 's,void \*,const void \*,g' memcached_dtrace.h | \ sed -e 's,char \*,const char \*,g' | tr '\t' ' ' > mmc_dtrace.tmp mv mmc_dtrace.tmp memcached_dtrace.h memcached_dtrace.o: $(memcached_OBJECTS) $(DTRACE) $(DTRACEFLAGS) -G -o memcached_dtrace.o -s ${srcdir}/memcached_dtrace.d $(memcached_OBJECTS) memcached_debug_dtrace.o: $(memcached_debug_OBJECTS) $(DTRACE) $(DTRACEFLAGS) -G -o memcached_debug_dtrace.o -s ${srcdir}/memcached_dtrace.d $(memcached_debug_OBJECTS) SUBDIRS = doc DIST_DIRS = scripts EXTRA_DIST = doc scripts t memcached.spec memcached_dtrace.d version.m4 README.md LICENSE.bipbuffer MOSTLYCLEANFILES = *.gcov *.gcno *.gcda *.tcov test: memcached-debug sizes testapp $(srcdir)/sizes $(srcdir)/testapp prove $(srcdir)/t @if test `basename $(PROFILER)` = "gcov"; then \ for file in memcached_debug-*.gc??; do \ mv -f $$file `echo $$file | sed 's/memcached_debug-//'`; \ done && \ for file in *.gcda; do \ srcfile=`echo $$file | sed 's/.gcda/.c/'`; \ if test -n "`echo $(memcached_debug_SOURCES) | grep $$srcfile`"; then \ echo `$(PROFILER) $$srcfile` | sed 's/'$$srcfile':.*//'; \ fi \ done \ elif test `basename $(PROFILER)` = "tcov"; then \ files=`grep SRCFILE memcached-debug.profile/tcovd | sed 's/SRCFILE://' | sort | uniq` && \ $(PROFILER) -x memcached-debug.profile $$files 2>&1; \ for file in *.tcov; do \ srcfile=`echo $$file | sed 's/.tcov//'`; \ if test -n "`echo $(memcached_debug_SOURCES) | grep $$srcfile`"; then \ echo $$srcfile : `grep 'Percent of the file executed' $$file`; \ fi \ done \ else :; fi docs: (cat Doxyfile ; echo "PROJECT_NUMBER=`cat version.num`") | doxygen - dist-hook: rm -f $(distdir)/*/*~ $(distdir)/t/lib/*~ $(distdir)/*~ maintainer-clean-local: -rm Makefile.in -rm aclocal.m4 -rm config.guess -rm config.sub -rm depcomp -rm install-sh -rm ltmain.sh -rm missing -rm configure -rm config.log -rm config.status
參考資料:
《鳥哥的Linux私房菜》
http://blog.csdn.net/zmxiangd...linux