编译知识

gcc编译器

编译过程中参数

  • -E 只预处理,生成预处理文件 .i
  • -S 只编译不汇编,生成编译代码 .s
  • -c 只编译不链接,生成目标文件.o
  • -g 包含调试信息
  • -I[dir]包含指定路径头文件

生成链接库参数

linux下的链接库格式:

静态库: libname.a
动态库: libname.so.主版本号.次版本号.发行号

  • -static 静态编译,默认
  • -shared 动态编译,生成动态库文件
  • -L dir 库文件搜索中添加路径
  • -fPIC 生成与位置无关的目标代码(position independent code)

生成静态链接库

  1. gcc -c sum.c -o libsum.o 生成目标文件.o
  2. ar crv libsum.a libsum.o 打包,生成.a文件

使用静态链接库
gcc -o 可执行文件 main.c -L /静态库路径

生成动态链接库

  1. gcc -fPIC -c sum.c -o libsum.o
  2. 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文件:

  1. 项目目录下,运行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 输出
  2. 运行 aclocal,根据 configure.ac 生成 aclocal.m4 文件,该文件主要处理各种宏定义

  3. 运行 autoconf,将 configure.ac 中的宏展开,生成 configure 脚本,这过程中可能会用到 aclocal.m4

  4. 执行 autoheader,生成 config.h.in 文件,该命令通常会从 "acconfig.h” 文件中复制用户附加的符号定义。该例子中没有附加的符号定义, 所以不需要创建 "acconfig.h” 文件

  5. 创建 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 : 可执行文件依赖的所有源文件。
  6. 手动添加必要的文件 NEWS,README,AUTHORS,ChangeLog

  7. 执行 automake --add-missing ,该命令生成 Makefile.in 文件。使用选项 "--add-missing" 可以让 automake 自动添加一些必需的脚本文件。

  8. 执行 ./configure 生成 Makefile

  9. 安装步骤:

    • make
    • sudo make install 即可将可执行文件安装在 /usr/local/bin/ 目录下,以后就可以直接使用
    • sudo make uninstall 即可将安装的可执行文件从 /usr/local/bin 目录下移除
  10. 如果要发布你的软件

    make dist 即可打包生成 xxx-version.tar.gz 文件

posted @ 2019-04-21 19:15  凌晨四点的洛杉矶  阅读(180)  评论(0编辑  收藏  举报