利用GNU 开发工具套件开发c++应用程序

开发c++应用程序你会选用什么开发工具?Windows下用的最多的可能就是vc++了,或者CBuilderX,但是,我很穷,我没有几万人民币去买这些昂贵的开发组件,如果你有,恳请你不要忘了给我等难兄难弟施舍点。linux下,Kdevelop,大名鼎鼎(windows下也有,我也在用,不过不大稳定),再有就是后起之秀eclipse(无所不能,平台无关).而这两者,说出来你可能不信,都是基于我现在要讲的GNU development tools。
如果你对GNU还不大了解的话,请访问其官方网站(www.gnu.com).
这一套GNU development tools包括Automake, Autoconf, Libtool, Make, Emacs, Texinfo 和 GNU C and C++ 编译器(gcc系列).这些工具都是免费的,跨平台的(unix,linux,windows).
一.安装
1。linux\unix
既然是GNU嘛,当然就得遵守GNU规范了。
(1)下载。http://ftp.gnu.org/gnu/,或者你也可以在其主页上选择其他的镜像从那下载,理论上来讲,近点的镜像应该会更快
下面假设有一个软件包名为foo-1.0.tar.gz,以之为例
(2)解压 (unpack)
% gunzip foo-1.0.tar.gz
% tar xf foo-1.0.tar
(3)配置 (Configure)
% ./configure
注意:查看下有没有error
(4)编译 (compile)
% cd foo-1.0
% make
如果这个软件包很大的话,你可以先去喝杯咖啡.^_^
编译完后,你可以测试一下编译是否成功
% make check
(5)安装 (install)
% su
# make install
上面的步骤看起来很简单,用过linux的人都应该很熟悉,然而下面的核心就是,如何让你的软件包也遵守这样的规范.遵守规范的一大好处就在于,即使你不写INSTALL,其他人也可以很轻松的安装并使用,而且,你还可以不负责任的直接用下面要讲的工具自动生成一个安装文档交给用户.
2.windows
如果你的windows 下有cygwin的话,那就很简单了,直接下载cygwin中相应的软件包,然后和以前一样点安装就行了。
如果没有的话,那么你可以在www.sourceforge.net中找到GNU的windows版本GNU-win,之后的过程就没什么好讲的了
二。GNU标准
嗯..这东西讲起来就比较麻烦了.大体上主要的最简单的上面你已经看到了,要更深入嘛,还是去看专门的文档吧.因为makefile,configure的语法是在是太复杂,所以才会有我后面要给你介绍的autotools
三。使用
1。emacs
emacs纯粹是一个无所不能的东西,由于它是在是太庞大,我无法对其做任何简单的介绍。关于它的文档,你可以在网上找到很多。如果你有耐心去学的话,它能完全替代你手头的任何文档编辑工具,若非我对微软输入法2003情有独钟,我现在也不会在此用OpenOffice了(MS Word太贵,买不起)。如果你对linux/unix下的文本编辑曾略有了解的话,那么你可以想象下vi+grep+sed+awk是什么样可怕的组合,而他们仅是emacs的一部分而已,只是当emacs满足不了你的需求的时候你在不退出emacs的前提下去调用他们为你完成其他任务而已。如果你能用好它,利用正则表达式和流替换,不会再有哪个老板敢按代码行数行给你算报酬。而且我说过,它是无所不能的,编辑,调试,运行等在其中一气呵成。没事干还可以拿它聊聊MSN,玩会儿扫雷,或者如果你不想傻等着他慢慢吞吞的给你编译你数万行的程序,你可以让他顺便先给你煮杯咖啡。对了,忘了说了,它和eclipse一样,由于开放,所以基本上支持现有的所有主流的程序设计语言(那些国产的什么什么语言暂时你就别想了) .它的使用,你还是找本专门的文档来看吧,如果你实在是找不到,可以发e-mail向我索取.snnn119@163.com, snnn119@hotmail.com, me@sunchangming.com, snnn119@yahoo.com
^_^
这里需要补充的是,如果你是unix/linux/cygwin的话,下面的脚本可以帮你自动在源文件头加上GPL版权声明:
在home/.emacs中加入
(setq user-mail-address "me@here.com")
(setq user-full-name "My Name")
设置你的邮箱地址和你的姓名
然后,装载脚本
(require ''gpl)
(require ''gpl-copying)
之后你在编辑文本的时候,用M-x(一般即alt+x)切到下面输入gpl,就行了,较新的版本可能是gpl-cc。
2.gcc
来吧,开始我们的helloworld之旅。
下面以emacs为例,当然,你也可以用vc++或是eclipse甚至是notepad
打开emacs,新建一个文件,hello.c,输入
#include
int
main ()
{
printf ("Hello world\n");
}
然后C-x,C-f保存(注:下面讲emacs快捷键的地方,一般C代表Ctrl,M代表Alt)
当然,你也可以再试试gpl脚本,用M+\<切到文件头,然后M+x,gpl-cc,呵呵,是不是有点眼花缭乱? 别忘了保存.
然后编译,你可以切到shell(windows下则是cmd)中去,或是直接M+!输入
gcc hello.c -o hello
来,运行下,
% ./hello
Hello world
嗯。。。如果一切都是如此简单的话,那么,我就没必要往后写了。如果你有三个源文件,那你就得这样:
% gcc -c foo1.c
% gcc -c foo2.c
% gcc -c foo3.c
% gcc foo1.o foo2.o foo3.o -o foo
如果是三十个怎么办?尤其对于c++程序员,如果一个程序的源文件还不足三十个,还不如改用c换点运行效率来。而且不停的调试,就得不停的编译,然后你就这样,每次输入上百行的编译指令去?聪明的程序员是会偷懒的,于是就有了Makefile.哈哈,写个脚本让它自己去编译。嗯。。。如果你随便打开一个Makefile的话,如果它遵守我上面所说的GNU规范的话,你会发现它比我们的HelloWorld要大几百倍!怎么办?继续,写个脚本让它自动生成Makefile.好,假如这个脚本也很复杂怎么办?那再。。。对!这是最后一步了,我们不能让这个复杂的循环在继续下去,不然我们都会发疯的。好,废话少说,拿出我们的终极武器acmkdir
3。acmkdir
俗话说高手往往都是在最后才出现,可是如果我继续在此跟你磨嘴皮的话,你会埋怨你喝完了一罐咖啡也还没有学会怎么去做一个简单的helloworld,那我真的是罪不容轻啊。
% ackdir hello
中间它问你什么你就答什么吧,问你是否你就回答y。其实它也就顶多问下你的邮件地址和e-mail.好的,看它做了些什么,它生成了一个文件夹,里面有很多文件和文件夹。其中有一个叫src的看见了吗?对,把你的源文件放进去。然后,我们就可以开始写我们的编译脚本了。
检查下主目录hello下有没有一个文件configure.in,打开它,看看里面有没有
AC_PROG_CC
AC_PROG_CXX
这样两行,没有的话就把它添进去。
(一般都有,不过现在版本变化都挺大的,说不准)
最后检查下,看看它是不是具有这样的形式
AC_INIT
AM_CONFIG_HEADER(config.h)
AM_INIT_AUTOMAKE(test,0.1)
AC_PROG_CC
AC_PROG_CXX
AC_PROG_RANLIB
AC_OUTPUT(Makefile doc/Makefile m4/Makefile src/Makefile)
新版本可能会略有差异。
然后找下这个目录下的Makefile.am看看是不是这样
EXTRA_DIST = reconf configure
SUBDIRS = m4 doc src
来,试试
./reconf
它会执行
% rm -f config.cache
% rm -f acconfig.h
% aclocal -I m4
% autoconf
% acconfig
% autoheader
% automake -a
如果没有的话,你就手动建一个这样的脚本,在我知道有acmkdir之前,一直都是手动在输这些命令,苦闷死了。
然后到src目录下,看看是不是有个文件叫Makefile.am(或是Makefile.in)
写上
bin_PROGRAMS = hello
hello_SOURCES = hello.c
然后看看你的hello.c
在前面加上
#if HAVE_CONFIG_H
# include
#endif
嗯。大功告成,来,
% ./reconf
% ./configure
% make
% make distcheck
屏幕上的输出可能已经足够让你眼花缭乱了。但是结果你应该很清楚,你得到了所有你想要的,目标文件和打好包的压缩文件。
p.s.你可以比较一下它和rar的压缩效率,你就不会再诧异为什么国外很少有人在用rar了
不行了,太晚了,我要先睡了,明天再写如何用GDB调试程序,最后再说一点,所有的这一切都几乎是平台无关,这一切操作我都是在windows下进行的(呵呵,我还是喜欢微软输入法2003).

此博客中的热门博文

少写代码,多读别人写的代码

在windows下使用llvm+clang

tensorflow distributed runtime初窥