源码安装:配置(configure)、编译(make)、安装(make install),所有操作中间错误可以忽略,最后段末尾统一报错。 ####1.配置 configure:生成Makefile的shell脚本 文件结构如下: <文件夹> |-configure.in |-Makefile.am |-acconfig.h |-<源码文件> |-tt.c |-qq.c |-qq.h |-Makefile.am 其中configure.in作为./configure的配置输入;makefile.am通过automake生成makefile.in再由./configure生成makefile;acconfig.h由autoheader生成config.h.in再由./configure生成config.h configure.h使用autoconf和automake命令的shell脚本,可以通过autoscan自动生成或手写 acconfig.h包含了configure.in中未定义的宏 autoscan–>autoheader–>aclocal–>automake|autoconf
(GNU m4宏处理器处理*.m4宏文件) ####2.编译 gcc找不到头文件: sudo find /(目录) -name 文件
makefile的一般格式:目标:依赖 命令 例如:a.c,b.c,main.c三个源文件,最终要编译成一个名为main的可执行文件
代码语言:javascript复制main : a.o b.o main.o
gcc a.o b.o main.o -o main
main.o : main.c
gcc -c main.c
b.o : b.c
gcc -c b.c
a.o : a.c
gcc -c a.c
#用".PHONY {目标名}"显式定义一个伪目标(可以隐式定义)
# 用"make {目标名}"执行该伪目标
.PHONY : clean
clean :
@rm -f main *.o
@echo 'clean'
makefile变量定义:
代码语言:javascript复制'=':(直接赋值,只有变量引用则未被赋值)
':=':(选择有值的变量赋值)
'?=':(已被赋值的变量不赋值)
' =':(追加赋值,**makefile变量值都是字符串**)
变量引用:$(变量)
makefile条件选择:
代码语言:javascript复制ifeq 'arg1' 'arg2'或ifeq ( arg1, arg2 )或ifeq "arg1""arg2"
ifneq 'arg1' 'arg2'或ifneq ( arg1, arg2 )或ifneq "arg1""arg2"
ifdef variable-name
makefile函数:
代码语言:javascript复制$(<function> <argment>)或者${<function> <argment>}
makefile系统函数:
代码语言:javascript复制$(subst <from>,<to>,<text>)字符串替换函数
$(patsubst <pattern>,<replacement>,<text>)模式字符串替换
函数
$(strip <string>)去空格
$(findstring <find>,<in>)查找string
$(filter <pattern>,... <text>)过滤字符串
$(sort <list>)排序
$(word <n>,<text>)取单词
$(wordlist <s>,<e>,<text>)取单词串
$(words <text>)单词数统计
$(firstword <text>)查找首单词
$(join <list1>,<list2>)合并字符串
--------------------------------
$(dir <names...>)文件名中取出目录部分
$(notdir <names...>)取文件名部分
$(suffix <names...>)取后缀扩展名
$(basename <names...>)取文件名前部分
--------------------------------
foreach函数:$(foreach <var>,<list>,<text>)函数返回值一次性赋值给变量组成新的字符串
if函数:$(if <condition>,<then-part>)
$(call <expression>,<parm1...>)
使用CMAKE生成makefile: http://digdeeply.org/archives/0421949.html ####3.安装
生成的可执行文件安装,用make install,安装文件到usr/bin下 (卸载使用make uninstall,清理make产生的缓存文件使用make clean) ####4.软件包管理工具 linux分为桌面系统领域和服务器系统领域,服务器系统如:rethat、suse、gentoo、arch、fedora、国产中标麒麟;桌面系统如:centos、ubuntu linux软件包分为两大阵营:RPM和DPKG,与bin安装和源码安装相比,管理包工具使用数据库方式管理软件包和包的依赖项,安装路径系统默认 RPM(rpm包文件,yum自动解决依赖关系,rpm安装需要解决依赖关系) DPKG(debian包文件,遵循GNU规范,apt自动解决依赖关系)
checkinstall(生成RPM包或DEB包) alien(rpm到debian包装换工具) 打包RPM: http://blog.csdn.net/king_on/article/details/7169384 ####5.安装包依赖关系 linux安装通常都会遇到安装包依赖导致安装失败,如configure编译时需要其他SDK的支持,check检查各模块是否安装,如下运行./configure检测到没有安装的应用:
代码语言:javascript复制checking for g ... no
checking for c ... no
checking for gpp... no
checking for aCC... no
checking for CC... no
checking for cxx... no
checking for cc ... no
checking for cl... no
checking for FCC... no
checking for KCC... no
checking for RCC... no
checking for xlC_r... no
checking for xlC... no
####6.环境变量 全局环境变量: 1.etc/profile配置文件(export导出全局变量) 执行source etc/profile立即生效 2.etc/bashrc 3.home/*(用户)/bash_profile 本地环境变量(shell脚本范围): env(显示所有)、echo $变量、set(显示本地定义)、export新增
参考: http://blog.163.com/niwei_258/blog/static/1062848820101022105356248/ (configure)