Linux Apps安装篇

SVN

1
2
3
4
5
6
7
8
9
10
11
yum -y install subversion
rpm -ql subversion # 查看svn安装位置
mkdir /var/svn/svnrepos
svnadmin create /var/svn/svnrepos/xxxx (xxxx为你预期的版本库名称, 可自定义)# 创建版本库
cd /var/svn/svnrepos/xxxx/conf # 修改配置

authz
hooks-env.tmpl
passwd
svnserve.conf
.swp

protobuf

github上有详细的安装说明: https://github.com/google/protobuf/blob/master/src/README.md

1.确保centos7上已经安装了下面的软件, 或者直接用yum进行更
autoconf/automake/libtool/curl(used to download gmock)/make/g++/unzip

2.下载源码包, 解压, 编译安装
地址: https://github.com/google/protobuf/releases, 选择Source code (tar.gz)下载

1
2
3
4
5
6
7
8
tar -zxvf protobuf-3.1.0.tar.gz -C /usr/local/
cd protobuf-3.1.0/
./autogen.sh # 如果使用的不是源码, 而是release版本 (已经包含gmock和configure脚本), 可以略过这一步
./configure --prefix=/usr/local/protobuf # 指定安装路径
make # 编译
make check # 测试, 这一步很耗时间
make install # 安装
ldconfig # refresh shared library cache.

3.设置一下环境变量 /etc/profile

1
2
3
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/protobuf/lib # (动态库搜索路径) 程序加载运行期间查找动态链接库时指定除了系统默认路径之外的其他路径
export PATH=$PATH:/usr/local/protobuf/bin
export LIBRARY_PATH=$LIBRARY_PATH:/usr/local/protobuf/lib # (静态库搜索路径) 程序编译期间查找动态链接库时指定查找共享库的路径

4.查看版本
protoc –version

3 Linux下构建程序

单个文件的编译:

1
g++ -o main.cpp main # 生成了

多文件关联时, 依赖关系:

1
2


人为操作, 效率低, 容易失误

makefile是文件, make是命令
makefile告诉程序如何构建 -> make通过makefile知道依赖关系, 只编译有改动的代码

makefile的编写枯燥低效容易失误, 使用工具生成

automake和CMake

简介

下面是典型的使用GNU的AUTOCONF和AUTOMAKE产生的程序的安装步骤:

autoconf是用来生成自动配置软件源代码脚本(configure)的工具. configure脚本能独立于autoconf运行, 且在运行的过程中, 不需要用户的干预.

使用流程

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
autoscan # autoscan将扫描指定目录(默认当前目录)中的源文件, 并创建configure.scan文件

# ---------------------------TODO1: 修改configure.scan的内容

aclocal # aclocal是一个perl脚本程序. aclocal根据configure.ac文件的内容, 自动生成aclocal.m4文件, m4是一个宏处理器. 将输入拷贝到输出, 同时将宏展开

autoconf # autoconf根据configure.ac和aclocal.m4来产生configure文件

# ---------------------------TODO2: 编写Makefile.am的内容

automake --add-missing # automake根据configure.ac和Makefile.am来产生Makefile.in
# --add-missing定义是"add missing standard files to package", 它会让automake加入一个标准的软件包所必须的一些文件

./configure # configure是一个脚本, 它能设置源程序来适应各种不同的操作系统平台, 并且根据不同的系统来产生合适的Makefile, 从而可以使源代码能在不同的操作系统平台上被编译出来

make check # 检查make所需要的环境, 确保make是没有错误的

make # make是用来编译的, 它从Makefile中读取指令

sudo make install # make install是用来安装的, 它也从Makefile中读取指令, 根据./configure指定的安装路径将程序安装到指定路径

以上步骤我们需要着重关注的To Do List:

  • TODO1: 修改configure.scan的内容

首先将configure.scan改名为configure.ac, configure.ac是接下来我们所需要的经过处理了的必要文件.

configure.ac文件的内容是一些宏, 这些宏经过m4宏处理器展开和autoconf处理后会变成检查系统特性,环境变量,软件必须的参数的shell脚本.

https://www.gnu.org/software/autoconf/manual/autoconf-2.61/html_node/Indices.html#Indices

configure.ac文件中的宏的顺序并没有规定, 但是你必须在所有宏的最前面和最后面分别加上AC_INIT宏和AC_OUTPUT宏.

在configure.ac中:

标准构建顺序:
Autoconf requirements
AC_INIT(package, version, bug-report-address)
information on the package
checks for programs
checks for libraries
checks for header files
checks for types
checks for structures
checks for compiler characteristics
checks for library functions
checks for system services
AC_CONFIG_FILES([file…])
AC_OUTPUT

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
# 以下: 参数列表[]表示可选的

# AC_INIT(package, version, [bug-report], [tarname])初始化配置, 在所有操作之前'必须'调用它
# @package:包名 @version:版本(--version输出的东西) @bug-report: 反馈bug到邮箱 @tarname: tar包名
AC_INIT(package, version)

# 随其后的是AC_CONFIG_HEADERS(header ..., [cmds], [init-cmds]), 配置头文件, 定义一些测试的宏, 这个文件需要包含在package的每个头文件中, 以保证一致性
# @header...:一般为common.h, 可由autoheader生成
AC_CONFIG_HEADERS(common.h)

# AC_PROG_CXX([compiler-search-list])检查C++编译器
# AC_PROG_CC ([compiler-search-list])检查C编译器
AC_PROG_CXX([compiler-search-list])
AC_PROG_CC ([compiler-search-list])

# 设置输出变量INSTALL为一个叫install的程序
AC_PROG_INSTALL

# ...
AC_PROG_MAKE_SET

AC_PROG_LIBTOOL

# AC_CHECK_LIB(library, function, [action-if-found], [action-if-not-found], [other-libraries])检查库文件
# @library:库名 @function:测试程序用来检查库
# Test whether the library library is available by trying to link a test program that calls function function with the library. function should be a function provided by the library. Use the base name of the library; e.g., to check for -lmp, use `mp' as the library argument.
AC_CHECK_LIB(pthread, ?)

# AC_SUBST(variable, [value])由variable创建一个输出变量

# AC_ARG_WITH(package, help-string, [action-if-given], [action-if-not-given])外部然健一来
AC_ARG_WITH([readline],
[AS_HELP_STRING([--with-readline],
[support fancy command line editing @<:@default=check@:>@])],
[],
[with_readline=check])

LIBREADLINE=
AS_IF([test "x$with_readline" != xno],
[AC_CHECK_LIB([readline], [main],
[AC_SUBST([LIBREADLINE], ["-lreadline -lncurses"])
AC_DEFINE([HAVE_LIBREADLINE], [1],
[Define if you have libreadline])
],
[if test "x$with_readline" != xcheck; then
AC_MSG_FAILURE(
[--with-readline was given, but test for readline failed])
fi
], -lncurses)])

# Expands into an help string that looks pretty when the user executes `configure --help'. It is typically used in AC_ARG_WITH or AC_ARG_ENABLE
# AS_HELP_STRING (left-hand-side, right-hand-side)

# AC_CHECK_PROG(variable, prog-to-check-for, value-if-found, [value-if-not-found], [path], [reject])

# AC_ARG_ENABLE(feature, help-string, [action-if-given], [action-if-not-given])

# AC_MSG_ERROR(error-description, [exit-status])打印错误消息

# AC_CONFIG_FILES(file..., [cmds], [init-cmds])

# AC_OUTPUT Generate config.status and launch it. Call this macro once, at the end of configure.ac.
  • TODO2: 编写Makefile.am的内容

Makefile.am是用来生成Makefile.in的, 需要你手工书写. Makefile.am中定义了一些内容:

1
2
3
AUTOMAKE_OPTIONS  # 在执行automake时, 它会检查目录下是否存在标准GNU软件包中应具备的各种文件, 例如AUTHORS ChangeLog NEWS等文件. 将其设置成foreign时, automake会改用一般软件包的标准来检查.
bin_PROGRAMS   # 这个是指定所要产生的可执行文件的文件名. 如果你要产生多个可执行文件, 那么在各个名字间用空格隔开.
helloworld_SOURCES # 这个是指定产生"helloworld"时所需要的源代码. 如果它用到了多个源文件, 那么请使用空格符号将它们隔开. 比如需要helloworld.h, helloworld.c那么请写成helloworld_SOURCES= helloworld.h helloworld.c. 如果你在bin_PROGRAMS定义了多个可执行文件, 则对应每个可执行文件都要定义相对的filename_SOURCES.

通过 ./configure –help 察看详细的说明帮助
./configure –prefix=/usr # 将该软件安装在/usr下面, 执行文件就会安装在/usr/bin(而不是默认的/usr/local/bin), 资源文件就会安装在/usr/share(而不是默认的/usr/local/share)
同时一些软件的配置文件可以通过指定–sys-config=参数进行设定
还有诸如: –with/–enable/–without/–disable等等参数对编译加以控制

.Makefile
在符合GNU Makefiel惯例的Makefile中, 包含了一些基本的预先定义的操作:

1
2
3
4
5
6
make          # 根据Makefile编译源代码, 连接, 生成目标文件, 可执行文件.
make clean   # 清除上次的make命令所产生的object文件(后缀为".o"的文件)及可执行文件.
make install  # 将编译成功的可执行文件安装到系统目录中, 一般为/usr/local/bin目录.
make list   # 产生发布软件包文件(即distribution package). 这个命令会将可执行文件及相关文件打包成一个tar.gz压缩的文件用来作为发布软件的软件包. 它会在当前目录下生成一个名字类似"PACKAGE-VERSION.tar.gz"的文件. PACKAGE和VERSION, 是在configure.ac中定义的AM_INIT_AUTOMAKE(PACKAGE, VERSION).
make distcheck # 生成发布软件包并对其进行测试检查, 以确定发布包的正确性. 这个操作将自动把压缩包文件解开, 然后执行configure命令, 并且执行make, 来确认编译不出现错误, 最后提示你软件包已经准备好, 可以发布了.
make distclean # 类似make clean, 但同时也将configure生成的文件全部删除掉, 包括Makefile.

1.autoscan (autoconf): 扫描源代码以搜寻普通的可移植性问题,比如检查编译器,库,头文件等,生成文件configure.scan,它是configure.ac的一个雏形。
2.aclocal (automake):根据已经安装的宏,用户定义宏和acinclude.m4文件中的宏将configure.ac文件所需要的宏集中定义到文件 aclocal.m4中
3.autoheader(autoconf): 根据configure.ac中的某些宏,比如cpp宏定义,运行m4,声称config.h.in
4.automake: automake将Makefile.am中定义的结构建立Makefile.in,然后configure脚本将生成的Makefile.in文件转换为Makefile。如果在configure.ac中定义了一些特殊的宏,比如AC_PROG_LIBTOOL,它会调用libtoolize,否则它会自己产生config.guess和config.sub
5.autoconf:将configure.ac中的宏展开,生成configure脚本。这个过程可能要用到aclocal.m4中定义的宏。

user input files optional input process output files
acinclude.m4 - - - - -.
V
.——-,
configure.ac ————————>|aclocal|
{user macro files} ->| |——> aclocal.m4
-------' aclocal.m4 - - - - - - - . | V .----------, configure.ac ----------------------->|autoheader|----> autoconfig.h.in .--------, | | - - -> COPYING | | - - -> INSTALL | |------> install-sh | |------> missing |automake|------> mkinstalldirs configure.ac ----------------------->| | Makefile.am ----------------------->| |------> Makefile.in | |------> stamp-h.in .---+ | - - -> config.guess | | | - - -> config.sub |——+-‘
| | - - - -> config.guess
|libtoolize| - - - -> config.sub
| |——–> ltmain.sh
| |——–> ltconfig
`———-‘
aclocal.m4 - - - - - -.
V
.——–,
configure.ac ———————–>|autoconf|——> configure —–>autoconfig.h,Makefile

google-perftools

google-perftools 简介

google-perftools 是一款针对 C/C++ 程序的性能分析工具,它是一个遵守 BSD 协议的开源项目。使用该工具可以对 CPU 时间片、内存等系统资源的分配和使用进行分析,本文将重点介绍如何进行 CPU 时间片的剖析。 google-perftools 对一个程序的 CPU 性能剖析包括以下几个步骤。

  1. 编译目标程序,加入对 google-perftools 库的依赖。
  2. 运行目标程序,并用某种方式启动 / 终止剖析函数并产生剖析结果。
  3. 运行剖结果转换工具,将不可读的结果数据转化成某种格式的文档(例如 pdf,txt,gv 等)。

下载, 编译和安装

Download: https://github.com/gperftools/gperftools
./autogen
./configure –prefix=/usr/local/google-perftools
make && make install

使用

您需要在原有的编译选项中加入对 libprofiler.so 的引用,这样在目标程序运行时会加载工具的动态库。例如本例中作者的系统中,libprofiler.so 安装在”/usr/lib”目录下,所以需要在 makefile 文件中的编译选项加入“-L/usr/lib -lprofile
r google-perftools 需要在目标代码的开始和结尾点分别调用剖析模块的启动和终止函数,这样在目标程序运行时就可以对这段时间内程序实际占用的 CPU 时间片进行统计和分析。工具的启动和终止可以采用以下两种方式。

a. 使用调试工具 gdb 在程序中手动运行性能工具的启动 / 终止函数。

gdb 是 Linux 上广泛使用的调试工具,它提供了强大的命令行功能,使我们可以在程序运行时插入断点并在断点处执行其他函数。具体的文档请参照 http://www.gnu.org/software/gdb/,本文中将只对用到的几个基本功能进行简单介绍。使用以下几个功能就可以满足我们性能调试的基本需求,具体使用请参见下文示例。

命令 功能
ctrl+c 暂停程序的运行
c 继续程序的运行
b 添加函数断点(参数可以是源代码中的行号或者一个函数名)
p 打印某个量的值或者执行一个函数调用
b. 在目标代码中直接加入性能工具函数的调用,该方法就是在程序代码中直接加入调试函数的调用。

两种方式都需要对目标程序重新编译,加入对性能工具的库依赖。对于前者,他的好处是使用比较灵活,但工具的启动和终止依赖于程序员的手动操作,常常需要一些暂停函数(比如休眠 sleep)的支持才能达到控制程序的目的,因此精度可能受到影响。对于后者,它需要对目标代码的进行修改,需要处理函数声明等问题,但得到的结果精度较高,缺点是每次重新设置启动点都需要重新编译,灵活度不高,读者可以根据自己的实际需求采用有效的方式。