您的位置:首页 > 编程语言 > C语言/C++

How to create a gun c/c++ project

2009-06-16 18:02 309 查看
1.目录结构最顶层目录用模块名称,这里是demo。

2.源文件放在模块下的src子目录中,即demo/src,一切遵循惯例,有多个子模块时,各个子模块的源代码放在各自的目录里。

3.创建源文件 demo/src/hello.c

4.创建Makefile模板 内容为:

# demo/Makefile.am

SUBDIRS=src

SUBDIRS=src 这里只有简单的一行代码,表示其下有一个src的子目录,如果有多个子目录,用空格分开就行了。

# demo/src/Makefile.am

AUTOMAKE_OPTIONS=foreign
SUBDIRS=src
bin_PROGRAMS=test
test_SOURCES=test.c

bin_PROGRAMS=test test_SOURCES=main.c这里表示有一个可执行文件test,test由源文件main.c编译而来。 PROGRAMS表示要产生的可执行文件,有多个可执行文件时,用空格分开,而bin表示可执行文件要安装的目录。 SOURCES表示生成可执行文件需要的源文件,有多个源文件时,也用空格分开。 .am扩展名是automake的简称,它是automake用来产生Makefile.in文件的模板。

5.创建autoconf模板。在demo下运行autoscan,生成文件configure.scan,把它改名为configure.in。内容如下:

# -*- Autoconf -*-
# Process this file with autoconf to produce a configure script.

AC_PREREQ(2.59)
AC_INIT(FULL-PACKAGE-NAME, VERSION, BUG-REPORT-ADDRESS)
AC_CONFIG_SRCDIR([src/test.c])
AC_CONFIG_HEADER([config.h])

# Checks for programs.
AC_PROG_CC

# Checks for libraries.

# Checks for header files.
AC_HEADER_STDC
AC_CHECK_HEADERS([string.h unistd.h])

# Checks for typedefs, structures, and compiler characteristics.

# Checks for library functions.

AC_CONFIG_FILES([src/Makefile])
AC_OUTPUT

修改后的内容如下:

# -*- Autoconf -*-
# Process this file with autoconf to produce a configure script.

AC_PREREQ(2.59)
AC_INIT(test, 0.1, BUG-REPORT-ADDRESS)
AC_CONFIG_SRCDIR([src/test.c])
AC_CONFIG_HEADER([config.h])
AM_INIT_AUTOMAKE(test,0.1)
# Checks for programs.
AC_PROG_CC

# Checks for libraries.

# Checks for header files.
AC_CHECK_HEADERS([unistd.h])

# Checks for typedefs, structures, and compiler characteristics.

# Checks for library functions.

AC_CONFIG_FILES([Makefile
src/Makefile])
AC_OUTPUT

这个文件由一系列的宏组成,这些宏最终由命令m4展开,得到一个脚本文件configure。configure的主要功能是探测系统的配置,然后根据这些配置来产生相应的Makefile文件。比如AC_PROG_CC 是用来检测编译器的,AC_CONFIG_FILES和AC_OUTPUT是用来产生Makefile和其它数据文件的。 不过这个模板文件还不能直接使用,需要做下列修改: 把: AC_INIT(FULL-PACKAGE-NAME, VERSION, BUG-REPORT-ADDRESS) 改为: AC_INIT(helloworld, 0.1, xianjimli@hotmail.com) FULL-PACKAGE-NAME 是模块的名称。 VERSION 是模块的版本号,初始版本号都用0.1。对小模块来说用两级版本号就够了,小数点前的为主版本号,只有重大更新时才升级主版本号。小数点后的为次版本号,每次发布都应该升级它。一般升级到0.9后,可以继续升级到0.10、0.11等。 BUG-REPORT-ADDRESS 是作者或维护者的邮件地址。 再加上一行automake的初始化脚本: AM_INIT_AUTOMAKE(helloworld, 0.1) helloworld是模块的名称。 0.1是模块的版本号。 这里和前面的参数是重复的,AC_INIT是初始化autoconf的,AM_INIT_AUTOMAKE是初始automake的。在有的情况下,只是产生数据文件,而不需要编译文件时,那就不需要AM_INIT_AUTOMAKE了。

6.拷贝所用到宏。运行:aclocal 前面说了,configure.in里是一系列的宏,这些宏由命令m4负责展开。m4 实际上就是macro的简称,4代表m后面省略了4个字母。类似的还有I18n (Internationalization )和 L10n(Localization),其中的数字都是代表所省略的字母个数。 AC_PROG_CC 之类的宏是标准的宏(或说是内置的宏),不需要我们自己去写它,但我们需要运行命令aclocal,aclocal把configure.in中所用到的宏全部拷贝到我们的工程里来。在helloworld目录下运行aclocal之后,当前目录下出现了: autom4te.cache 这是一个临时目录,只是用来加快宏展开的。 aclocal.m4 是configure.in中用到的宏的定义,有兴趣的读者可以看看。

7.产生配置头文件的模板。运行:autoheader 配置头文件(config.h)是用来定义在C/C++程序中可以引用的宏,像模块的名称和版本号等等。这些宏由configure脚本产生,但我们要提供一个模板文件。这个模板文件可以用命令autoheader产生出来。在helloworld目录下运行autoheader之后,当前目录下产生config.h.in,一般情况不用修改它。

8.创建几个必要的文件。 README:描述模块的功能、用法和注意事项等。 NEWS:描述模块最新的动态。 AUTHORS:模块的作者及联系方式。 ChangeLog:记录模块的修改历史,它有固定的格式: 1.最新修改放在最上面。 2.对于每条记录,第一行写日期,修改者和联系方式。第二行开始以tab开头,再加一个星号,后面再写修改的原因和位置等。如: 2009-03-29 Li XianJing * Created

9.生成Makefile.in和所需要的脚本。运行:automake -a 这个命令会建立COPYING depcomp INSTALL install-sh missing几个文件的链接,这些文件指向系统中的文件。automake最重要的功能是以Makefile.am为模板产生Makefile.in文件,Makefile.in相对于Makefile.am要复杂很多倍了,所幸的是我们不需要了解它。

10.产生configure脚本。运行:autoconf autoconf的功能是调用m4展开configure.in中的宏,生成configure脚本,这个脚本是最终运行的脚本。

11.产生最终的Makefile。运行:./configure configure有两个常用的参数: –prefix 用来指定安装目录,Linux下默认的安装目录是/usr/local。 –host 用于交叉编译,比如x86的PC机上编译在ARM板上运行的程序。 如:./configure –prefix=/home/lixianjing/work/arm-root/usr –host=arm-linux

12.编译:make

13. 安装运行:make install

14.发布软件包运行:make dist或者make distcheck ;make dist用来生成一个发布软件包,这里会产生一个名为test-0.1.tar.gz的文件。通常,源代码管理系统(cvs/svn/git)中的源代码是处于开发中的,是不稳定的,而发布的软件包则是稳定的,可供用户使用的。

make distcheck,生成发布软件包并对其进行测试检查,以确定发布包的正确性。这个操作将自动把压缩包文件解开,然后执行configure命令,并且执行make,来确认编译不出现错误,最后提示你软件包已经准备好,可以发布了。 在实际操作中,我们可以把make之前的部分动作放到一个脚本文件中,这个脚本文件通常取名为autogen.sh或者bootstrap。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: