编译知识
gcc编译器
编译过程中参数
- -E 只预处理,生成预处理文件 .i
- -S 只编译不汇编,生成编译代码 .s
- -c 只编译不链接,生成目标文件.o
- -g 包含调试信息
- -I[dir]包含指定路径头文件
生成链接库参数
linux下的链接库格式:
静态库: libname.a
动态库: libname.so.主版本号.次版本号.发行号
- -static 静态编译,默认
- -shared 动态编译,生成动态库文件
- -L dir 库文件搜索中添加路径
- -fPIC 生成与位置无关的目标代码(position independent code)
生成静态链接库
- gcc -c sum.c -o libsum.o 生成目标文件.o
- ar crv libsum.a libsum.o 打包,生成.a文件
使用静态链接库
gcc -o 可执行文件 main.c -L /静态库路径
生成动态链接库
- gcc -fPIC -c sum.c -o libsum.o
- gcc -shared libsum.o -o libsum.so
编译安装gcc
gcc源码及相关依赖包下载地址:
www.gun.org/software/具体软件
ftp://gcc.gnu.org/pub
https://directory.fsf.org/wiki/GNU
gcc安装需要以下依赖:
- m4 多处理器类库
- gmp GNU的多精度数字运算类库 需要依赖m4
- mpfr 多精度浮点运算的C类库 需要依赖gmp
- mpc 复杂的高精度运算的数学运算C类库 需要依赖gmp,mpfr
编译源码并安装步骤:./configure——make——make install
Autotools
Automake是一个自动生成符合GNU编码标准的Makefile.in文件的工具。 Automake需要使用Autoconf
autotools 工具集自动生成符合 Linux 规范的 Makefile 文件
linux下安装autotools工具集:
sudo apt-get install automake
安装完成后,会有如下工具可用:
- aclocal
- autoscan
- autoconf
- autoheader
- automake
制作makefile文件:
-
项目目录下,运行autoscan命令,生成configure.scan文件
# -*- Autoconf -*- # Process this file with autoconf to produce a configure script. AC_PREREQ([2.69]) AC_INIT([FULL-PACKAGE-NAME], [VERSION], [BUG-REPORT-ADDRESS]) AC_CONFIG_SRCDIR([hello.c]) AC_CONFIG_HEADERS([config.h]) # Checks for programs. AC_PROG_CC # Checks for libraries. # Checks for header files. # Checks for typedefs, structures, and compiler characteristics. # Checks for library functions. AC_OUTPUT
重命名 configure.scan 为 configure.ac ,并修改其内容为:
# -*- Autoconf -*- # Process this file with autoconf to produce a configure script. AC_PREREQ([2.69]) #AC_INIT([FULL-PACKAGE-NAME], [VERSION], [BUG-REPORT-ADDRESS]) \\修改此行 AC_INIT(hello, 0.1, yu@micron.com) AM_INIT_AUTOMAKE(hello, 0.1) //添加此行 AC_CONFIG_SRCDIR([hello.c]) AC_CONFIG_HEADERS([config.h]) # Checks for programs. AC_PROG_CC # Checks for libraries. # Checks for header files. AC_CHECK_HEADERS([stdlib.h unistd.h]) # Checks for typedefs, structures, and compiler characteristics. # Checks for library functions. AC_CONFIG_FILES([Makefile]) //添加此行 AC_OUTPUT
上述 configure.ac 中宏定义意义如下:
- AC_INIT : 声明软件名称,版本号及 bug report 地址
- AC_PREREQ :声明autoconf的版本号
- AM_INIT_AUTOMAKE : automake 需要的信息,参数为软件名和版本号
- AC_CONFIG_SRCDIR : autoscan 侦测的源文件名,用来确定目录的有效性
- AC_CONFIG_HEADERS : autoscan 定义要生成的头文件,后续 autoheader 要使用
- AC_PROG_CC : 指定编译器,默认为 gcc
- AC_CHECK_HEADERS : autoscan 侦测到的头文件
- AC_CONFIG_FILES : 指定生成 Makefile,如果是多目录结构,可指定生成多个Makefile,以空格分隔,例如,AC_CONFIG_FILES([Makefile src/Makefile])
- AC_OUTPUT : autoscan 输出
-
运行 aclocal,根据 configure.ac 生成 aclocal.m4 文件,该文件主要处理各种宏定义
-
运行 autoconf,将 configure.ac 中的宏展开,生成 configure 脚本,这过程中可能会用到 aclocal.m4
-
执行 autoheader,生成 config.h.in 文件,该命令通常会从 "acconfig.h” 文件中复制用户附加的符号定义。该例子中没有附加的符号定义, 所以不需要创建 "acconfig.h” 文件
-
创建 Makefile.am 文件,automake工具会根据 configure.in 中的参量把 Makefile.am 转换成 Makefile.in 文件,最终通过 Makefile.in 生成 Makefile
AUTOMAKE_OPTIONS=foreign bin_PROGRAMS=hello hello_SOURCES=hello.c main.c include_HEADERS=hello.h
对上述 makefile.am 中各标签的解释
- AUTOMAKE_OPTIONS : 由于 GNU 对自己发布的软件有严格的规范, 比如必须附带许可证声明文件 COPYING 等,否则 automake 执行时会报错。 automake 提供了3种软件等级: foreign, gnu, gnits, 默认级别是gnu, 在本例中,使用 foreign 等级,它只检测必须的文件
- bin_PROGRAMS : 要生成的可执行文件名称,如果要生成多个可执行文件,用空格隔开。
- (目标文件)_SOURCES : 可执行文件依赖的所有源文件。
-
手动添加必要的文件 NEWS,README,AUTHORS,ChangeLog
-
执行 automake --add-missing ,该命令生成 Makefile.in 文件。使用选项 "--add-missing" 可以让 automake 自动添加一些必需的脚本文件。
-
执行 ./configure 生成 Makefile
-
安装步骤:
- make
- sudo make install 即可将可执行文件安装在 /usr/local/bin/ 目录下,以后就可以直接使用
- sudo make uninstall 即可将安装的可执行文件从 /usr/local/bin 目录下移除
-
如果要发布你的软件
make dist 即可打包生成 xxx-version.tar.gz 文件