首先来说一个比较简单的编译Linux下C++的方法。
我们在文本编辑器里写一个C的简单的程序(好像所有学习C或者C++的书都会出现)
代码:
#include <stdio.h>
int main()
{
printf("Hello,World!\n");
return 0;
}
现在存盘为Hello.c,打开你的终端,并在文件当前目录输入:
代码:
g++ Hello.c -o hello
编译时可能会出现如下警告:no newline at and of file ,只有在文件结尾添加一个新行就好了。
然后在终端中输入 ./hello ,你就能在终端中看到程序运行结果了
如果一个项目中存在N多个.c文件,那么就要用到Makefile了。
现在开始介绍详细的过程:
1 、建目录
在你的工作目录下建一个helloworld 目录,我们用它来存放helloworld 程序及相关文件,如在/home/my/build下:
$ mkdir helloword
$ cd helloworld
2 、 helloworld.c
然后用你自己最喜欢的编辑器写一个hellowrold.c 文件,如命令:vi helloworld.c 。使用下面的代码作为helloworld.c 的内容。
int main(int argc, char** argv)
{
printf("Hello, Linux World!\n");
return 0;
}
完成后保存退出。
现在在helloworld 目录下就应该有一个你自己写的helloworld.c 了。
3 、生成configure
我们使用autoscan 命令来帮助我们根据目录下的源代码生成一个configure.in 的模板文件。
命令:
$ autoscan
$ ls
configure.scan helloworld.c
执行后在hellowrold 目录下会生成一个文件:configure.scan ,我们可以拿它作为configure.in 的蓝本。
现在将configure.scan 改名为configure.in ,并且编辑它,按下面的内容修改,去掉无关的语句:
============================configure.in 内容开始=========================================
# -*- Autoconf -*-
# Process this file with autoconf to produce a configure script.
AC_INIT(helloworld.c)
AM_INIT_AUTOMAKE(helloworld, 1.0)
# 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(Makefile)
============================configure.in 内容结束=========================================
然后执行命令aclocal 和autoconf ,分别会产生aclocal.m4 及configure 两个文件:
$ aclocal
$ls
aclocal.m4 configure.in helloworld.c
$ autoconf
$ ls
aclocal.m4 autom4te.cache configure configure.in helloworld.c
大家可以看到configure.in 内容是一些宏定义,这些宏经autoconf 处理后会变成检查系统特性、环境变量、软件必须的参数的shell 脚本。
autoconf 是用来生成自动配置软件源代码脚本(configure )的工具。configure 脚本能独立于autoconf 运行,且在运行的过程中,不需要用户的干预。
要生成configure 文件,你必须告诉autoconf 如何找到你所用的宏。方式是使用aclocal 程序来生成你的aclocal.m4。
aclocal 根据configure.in 文件的内容,自动生成aclocal.m4 文件。aclocal 是一个perl 脚本程序,它的定义是:“aclocal - create aclocal.m4 by scanning configure.ac” 。
autoconf 从configure.in 这个列举编译软件时所需要各种参数的模板文件中创建configure 。
autoconf 需要GNU m4 宏处理器来处理aclocal.m4 ,生成configure 脚本。
m4 是一个宏处理器。将输入拷贝到输出,同时将宏展开。宏可以是内嵌的,也可以是用户定义的。除了可以展开宏,m4 还有一些内建的函数,用来引用文件,执行命令,整数运算,文本操作,循环等。m4 既可以作为编译器的前端,也可以单独作为一个宏处理器。
注:这里需要加上一点
【**@linux hello】 $ touch NEWS README AUTHORS ChangeLog用于生成相关文件
4 、新建Makefile.am
新建Makefile.am 文件,命令:
$ vi Makefile.am
内容如下:
AUTOMAKE_OPTIONS=foreign
bin_PROGRAMS=helloworld
helloworld_SOURCES=helloworld.c
automake 会根据你写的Makefile.am 来自动生成Makefile.in 。
Makefile.am 中定义的宏和目标, 会指导automake 生成指定的代码。例如,宏bin_PROGRAMS 将导致编译和连接的目标被生成。
5 、运行automake
命令:
$ automake --add-missing
configure.in: installing `./install-sh'
configure.in: installing `./mkinstalldirs'
configure.in: installing `./missing'
Makefile.am: installing `./depcomp'
automake 会根据Makefile.am 文件产生一些文件,包含最重要的Makefile.in 。
6 、执行configure 生成Makefile
$ ./configure
checking for a BSD-compatible install... /usr/bin/install -c
checking whether build environment is sane... yes
checking for gawk... gawk
checking whether make sets $(MAKE)... yes
checking for gcc... gcc
checking for C compiler default output... a.out
checking whether the C compiler works... yes
checking whether we are cross compiling... no
checking for suffix of executables...
checking for suffix of object files... o
checking whether we are using the GNU C compiler... yes
checking whether gcc accepts -g... yes
checking for gcc option to accept ANSI C... none needed
checking for style of include used by make... GNU
checking dependency style of gcc... gcc3
configure: creating ./config.status
config.status: creating Makefile
config.status: executing depfiles commands
$ ls -l Makefile
-rw-rw-r-- 1 yutao yutao 15035 Oct 15 10:40 Makefile
你可以看到,此时Makefile 已经产生出来了。
7 、使用Makefile 编译代码
$ make
if gcc -DPACKAGE_NAME="" -DPACKAGE_TARNAME="" -DPACKAGE_VERSION="" -
DPACKAGE_STRING="" -DPACKAGE_BUGREPORT="" -DPACKAGE="helloworld" -DVERSION="1.0"
-I. -I. -g -O2 -MT helloworld.o -MD -MP -MF ".deps/helloworld.Tpo" \
-c -o helloworld.o `test -f 'helloworld.c' || echo './'`helloworld.c; \
then mv -f ".deps/helloworld.Tpo" ".deps/helloworld.Po"; \
else rm -f ".deps/helloworld.Tpo"; exit 1; \
fi
gcc -g -O2 -o helloworld helloworld.o
运行helloworld
$ ./helloworld
Hello, Linux World!
PS:如果是C++文件,可以执行如下命令
【**@linux】 $ vi Makefile
然后找到CC这个字段,将其值改为g++就OK了