资讯专栏INFORMATION COLUMN

Linux操作系统下源码编译安装软件

YancyYe / 1678人阅读

摘要:源码编译安装一般情况下,如果我们在下运行一个软件的话,需要先安装。现在这里主要讲源码编译安装首先源码是由语言编写的,但是语言是高级语言,机器无法识别语言代码。通常这个侦测程序文件名为或者。表示编译的目标文件。

源码编译安装

一般情况下,如果我们在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进行编译。例如:

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/
makefile.am文件解析

下面是memcached的makefile.am文件内容:

# 表示指定要生成的可执行应用程序文件,这表示可执行文件在安装时需要被安装到系统中。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 "	" " " > 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...

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/10059.html

相关文章

  • Linux软件安装管理之——源码安装详解

    摘要:源码包即程序软件的源代码一般也叫,即将软件的源码以打包后再压缩的资源包。 一、安装包分类 在Linux平台下,软件包的类型可以划分为两类:源码包、二进制包。 源码包:即程序软件的源代码(一般也叫Tarball,即将软件的源码以tar打包后再压缩的资源包)。 二进制包:如 Red Hat发行版的.rpm包,Debian发行版的.deb包。 这篇文章将要介绍的是Linux平台下的源码安装,...

    nodejh 评论0 收藏0
  • linux-源码编译安装和卸载

    摘要:正常的编译安装卸载源码的安装一般由个步骤组成配置编译安装。如果配置了,如安装后的所有资源文件都会被放在目录中,不会分散到其他目录。这样在编译完毕后,就不能再修改了。 正常的编译安装/卸载: 源码的安装一般由3个步骤组成:配置(configure)、编译(make)、安装(make install)。 configure文件是一个可执行的脚本文件,它有很多选项,在待安装的源码目录下使用命...

    Charles 评论0 收藏0
  • Linux操作系统源码编译安装软件

    摘要:源码编译安装一般情况下,如果我们在下运行一个软件的话,需要先安装。现在这里主要讲源码编译安装首先源码是由语言编写的,但是语言是高级语言,机器无法识别语言代码。通常这个侦测程序文件名为或者。表示编译的目标文件。 源码编译安装 一般情况下,如果我们在linux下运行一个软件的话,需要先安装。比如运行PHP软件的话,可以使用apt-get install php命令安装,或者编译安装php的...

    不知名网友 评论0 收藏0
  • Linux系统软件的“四”种安装原理详解:源码安装、RPM二进制安装、YUM在线安装、脚本安装

    摘要:但实际安装的还是源码包和二进制包。优点安装简单快捷缺点完全丧失了自定义性总结其实中软件包只有源码包和二进制包两种软件安装包。源码包安装位置安装在指定位置当中,一般是软件名源码包安装的服务,只能用绝对路径进行服务的管理。 一、Linux软件包分类 1.1 源码包     优点: 开源,如果有足够的能力,可以修改源代码; 可以自由选择所需的功能; 软件是编译安装,所以更加适合自己的系统,...

    pumpkin9 评论0 收藏0
  • Linux 挖坑不埋指南

    摘要:在的世界里,中文并不是必须的,英文是必须的,但是只要你愿意,还是有办法让支持中文的显示与输入的,而且搞定这个问题,意味着你对的认识程度已经超过了很多其他发行版的用户。 跳进 Linux 的唯一理由 既然知道 Linux 在这个世界已经存在了,而你又是个挺喜欢摆弄计算机的人,那么对 Linux 是怎样的一种存在难道不感到好奇么? 也许在你开始尝试使用 Linux 时,已经看到了很多对 L...

    李涛 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<