Title: `海风的Linux开发环境介绍
tag: linux开发入门, 开发环境, samba, indent, SourceInsight, Winux
文档发布声明: 任何人都可以针对本文档自由转贴,拷贝,引用,及修改后再发布,而无需过问我本人,只希望能够留下属于原作者的一些版权信息,请尊重原作者的劳动。
`海风 = temp77 ,意思是出生于 77 年的临时变量,目前就职于 GDLC .
简单归纳地说:
"Winux"式开发环境 -- 出于好的开发效率考虑,又何必拘泥于Win阵营还是Linux阵营呢?
( 补:由于个人偏爱C的开发,C++方面的一些设置请各位稍微自己变化、补充一下 )
首先声明一下:撰写本文的时候,测试和实践都是在 Red Hat Linux Enterprise AS4 (Nahant Update 4) 下完成的,简称 RHEL4_U4 。
我的开发环境选择是:
gcc+make + (Linux+ssh+samba) + (Win32+putty+SourceInsight) [ + indent.exe ]
简单解释一下上面所指的含义:
○ Linux下开发首先必须要有 gcc 和 make 实现编译、链接 ;
○ Linux下要提供远程连接的便利,推荐SSH方式(SSH数据传送量小、比VNC更专业,资源和带宽消耗也小得多);
○ samba打开Linux文件共享的大门,让从Win32下远程修改Linux文件系统下的源文件成为可能;
○ Win32下有非常方便和专业的源码编辑工具SourceInsight,简称为 SI,在熟练操作前提下可以大幅提升开发效率;
○ putty是Win32下(轻量级)连接Linux的SSH的实用工具,应用广泛还免费,值得推荐;
○ 上面还少提了一个net.exe,该命令可马上产生一个网络共享的网络磁盘(方便的很),但作为Win32的一个固定组件,故意省略了;
○ indent [是可选的]不强制使用(不过总有一些识货的人知道它的价值)。
写本文的初衷是,看到一些同学,在阅读源码的时候使用 SourceInsight ,修改后又打包上传到服务器(解压)编译执行,调试过程中有一些小的改动,又调出 VI 来一点点地找,一点点地改。这样子下来效率似乎是不太好。
有道是 "磨刀不误砍柴工",现提出从前一个公司继承过来的经验,即在Win32下使用高效率的编辑工具(SourceInsight)直接修改远程Linux上的源文件,配合SSH直接在远程Linux环境上执行编译和调试,这是一种实践证明非常高效的方法。
这里面没有什么大道理,完全是实践的总结。希望能对想学好Linux,但摸不到石头过河的后来者一点点启发而以。不过当然,要达到目标方法有很多,并不拘泥于以下介绍。
● 为什么要这样做
在Linux下开发,最好是编译完后马上能运行看到效果,和进行即时调试吧。gcc 是一个命令行(费解),加上 make 后会好一点点,但终归还是命令行呀!从前被 Visual Studio 集成开发环境娇宠惯的后来者们,一定会对这种改变无所适从,望而却步吧?
SourceInsight编辑环境,为了一些不适应Linux下集成开发环境的人所设,以目前自己经验来看,还是比较值得推荐。可惜它只能运行在Win32下面。这个工具本身提供了极为丰富的代码编辑手段外,还提供了一个自定义的宏(相当于插件,下面安装indent的时候会提到),让开发者自己定义希望实现的代码编辑行为,并很好的把一些外部工具的功能集成到开发环境当中去(比如集成pcLint静态检测代码缺陷等),具备相当大的灵活性!可以夸张地说"只有你想不到,没有它做不到的"。 [注:上一句已注明是夸张手法,不要钻牛角尖了]
其它的选择, Eclipse 编辑环境也不错(苦恼是天生运行较慢,可能源于使用Java开发,并且集中了太多累赘[希望"大一统"的代价啊])。 VC 吧行不行,当然也行!Samba 是沟通了 Linux 到 Windows 文件系统的桥梁,只要设置好它就可以无所不能,发挥你的想象力吧!
路过的B君:不好意思打个岔,爱因斯坦也说过,想象力比知识更重要! 因为知识可以学,,,,,
砰! 砰!嘭~~ [注:暴扁中...]
● SourceInsight的一些实用技巧
显然,本文的主题关注的是开发效率(并非代码的执行效率)。有哪些以及如何用好SI的快捷键和实用功能是重点。不过鉴于 SI 的快捷键(功能)太多了,只能一点一点地累积,希望年月之功可以补偿(我)现在懒惰的原罪!
○ SourceInsight中我个人认为最重要功能是 "Shift+F8" ,能让你关注的单词高亮显示,不要小看了这个功能,它是我用SI的一个非常重要的理由之一。
○ 最常用的是搜索功能 "Ctrl+Shift+F" 可以调出全局搜索(整个工程),如果少按了个 Shift 键,不好意思,那就只搜你当前打开的文件了。
○ 还有一个比较常用的快捷键 "Ctrl+等号" ,这可以帮助你找到某个函数或者变量在工程中定义的位置(假如它在本工程中被define)。
○ SI v3.5 关于中文搜索的一个 BUG (致命)的预防。
SourceInsight v3.5(.0042) 天生对中文支持不怎么友好,特别是下面一种情况必定导致它的异常退出!需要小心提防的。
先体验一下,哈。随便在本文里面选中并拷贝一小段文字(含中文),打开 SI 工程后,按 "Ctrl+Shift+F" 键调出全局搜索功能,这时,SI自动把剪贴板里面的内容置于搜索栏里,不过由于解析中文失败,会导致整个程序的异常退出(不要怕,这不会产生什么不良副作用的)。
-- 加装 indent.em 宏 --
这样做会有什么好处? 呵呵,如果我告诉你这样做没有一点好处你还会把这个"笨"家伙装上吗? 建议你先略过本段,等以后想到这方面的需要的时候再回来找我!
GNU组织出品的这个 indent 其实是用来美化代码的 (说的那么好听,其实是规范化代码风格的!!)。从前公司强制代码风格统一,每个月考编程规范(逼死人的90分才算及格!),稍不注意还被揪住小辫子算作代码缺陷率(抓辫子的是"狗屁"英雄!)。哈哈,要是早知道有这么好的东西用,就不必烦恼了(目前是我的SourceInsight最佳伴侣)。
下面简要介绍如何安装法:
① 首先安装 indent 的 Win32 版本。 下载文件请看 "http://www.gnu.org/software/indent/#downloading"
② 假设已经安装到这个目录下 "D:/Program Files/GnuWin32/bin/indent.exe"
如下调用一下命令行就可以重新对源文件排版( %1 为源码文件名 ),且不备份原来文件:
"D:/Program Files/GnuWin32/bin/indent.exe" --no-tabs -i3 -bl -nce -bls -bli0 --line-length120 -kr %1 -o %1
√ 注意,一、上面的执行文件路径根据实际情况修改; 二、本例子的风格是在 -kr 风格的基础上修改的(也就是 Kernighan & Ritchie style),他俩是C语言的创始人;
③ 找到你的 SourceInsight 的 base project 的路径
它一般会在你机器的 "我的文档" 目录下,如本例中的 "D:/Documents and Settings/Administrator/My Documents/Source Insight/Projects/Base"
④ 创建一个叫 indent.em 的 Source Insight 宏定义文件,内容如下:
macro indent()
{
execIndent = "D://Program Files//GnuWin32//bin//indent.exe";
//sPara = " -kr ";
sPara = " --no-tabs -i3 -bl -nce -bls -bli0 --line-length120 -kr ";
hbuf = GetCurrentBuf();
sFile = GetBufName (hbuf);
if (checkExtension(sFile))
{
SaveBuf(hbuf); // save Buffer first ,then open a cmd execute windows with minimized state [2] .
// msg("CmdLine = /"@execIndent@/" @sPara@ /"@sFile@/" ");
exitcode = ShellExecute("open", "/"@execIndent@/"", "@sPara@ /"@sFile@/" -o /"@sFile@/" ", "", 2);
// PS: Do not REMOVE the following statement that seem no use , or will cause "Reload Problem".
exitcode = RunCmdLine("cmd /c echo /"Reflushing .../"; cmd /c exit",".",true);
RunCmd("Reload File");
RunCmd("Reload Modified Files");
RunCmd("Parse File Now");
}
}
macro CheckExtension(sFile)
{
nLength = strlen(sFile)
while (nLength > 0)
{
if (sFile[nLength] == ".")
break
nLength = nLength - 1
}
ext = strmid(sFile, nLength+1, strlen(sFile))
if ( ext == "c"
|| ext == "cpp"
|| ext == "h"
|| ext == "hpp")
return True
else
return False
}
√ 补充说明:这个文件需要定位到 indent.exe 的位置,请相应修改 indent.em 里面路径 [注:使用双斜线作目录分隔字符]。
⑤ 创建了上面那个文件之后,打开你的 Source Insight ,使用打开 Project 选项,
打开 SouceInsight 默认的 Base Project (千万不要删了这个工程,否则会产生莫名其妙的错误)。
当然,之后的操作就是把 indent.em 那个文件加到 Base 工程之中,Rebuild Project 一下,上面所定义的宏就生效了。
⑥ 现在已经可以使用那个宏了,不过,在此之前,最好先设置它到 Menu 项上,然后给他一个快捷键,好让我们用的方便。
○ 在 Source Insight 里面,下拉 Options 菜单项,点选 Menu Assignments...
○ 在 Command 框 里输入 "Macro:indent" ,就可以选中你之前创建的 SI 宏了,把它 Insert 到 Work 那个子目录里(要自己在Menu下拉框里面选)。
○ 此时,在 Menu Contorl 下面你应该可以找到它了(indent),选中他,并点右下方倒数第二个 Button [Keys..] 的。
○ 现在只要给这个 Menu项 加上快捷键就行了,建议使用 'Ctrl+Alt+Shift+i' 。
○ 在打开一个源文件之后(记得备份),按下 "Ctrl+Alt+Shift+i" 的组合键看看?!
不多罗嗦了,还看不明白的自己做一遍,多试试准行。提示一下:Source Insight 的 .em 宏文件里,可以用 msg() 来进行调试。
● Linux 方需要设置什么
○ gcc 和 make :这个没什么好说的,政治任务死命令,连这个都没有还玩啥呢?用键盘敲一下 gcc 和 make 看看有什么反应(如果没安装会有相关报错的!)。 不会弄这个?不要告诉我你是将要搞开发的。
○ 打开 ssh 监听: 这个简单,首先用 lsof 命令确认一下,SSH 需要占用 22 端口进行监听连接请求的! 具体命令为 "lsof -i:22" 。[提示:没有网络的话,可以在你的 WinXP 里安个 VMware Server 版,那就有网络支持了!然后再在虚拟机中安装 Linux ,在里面使用 lsof ,噢,跑题了... ]
如果没有打开 SSH 端口(命令没有任何回显),那表明你的 SSH 服务没有启起来,视乎不同的Linux发行版本,都不一样,不过没关系,这应该都是很基本的配置。就请有缘人高抬贵手,上网搜一下解决方案。好了,略...
○ 配置好 samba : 重头戏来啦,前面说过,samba 是 Linux 和 Win32 文件系统之间的桥梁! 有了它,我们可以发挥天马行空的想象力,潇洒地做一回"假爱因斯坦"了。
我认为我所使用的 samba 的版本是3.0 ,因为在我敲命令 "man samba" 的时候看到的。 [小技巧:想知道某个词(如XXX)会不会存在相应的帮助内容,可尝试 "man -k XXX" 来看看]
( 注:下面介绍只为简单起见,没提到安全方面的设置,只满足搭建编程环境的最低需要而已,各位千万不要在公司的公网服务器上试。否则打开一个安全大窟窿给人攻击,可不要说我事先没警告过 )
① 我使用 root 用户登陆服务器,现在要给 samba 也建一个新用户,smb用户名也是 root ,密码为 123456 ,新创建的 smb用户的信息将会(自动)存储到服务器的 "/etc/samba/smbpasswd" 下。
执行命令:"smbpasswd -a root" 。输入两次密码完成操作后,请 cat "/etc/samba/smbpasswd" 再 确认一下。 [要重新设置密码,请执行 "smbpasswd root" 即可]
-- 大概各位兄弟都已经注意到,samba 的配置文件都是放在 /etc/samba 里面的,这里面有个叫作 smb.conf 的配置文件,接下来我们将重点介绍这个文件的组织,全路径是 "/etc/samba/smb.conf" 。
打开这个文件粗略浏览,这个配置文件是按照标准的 ini 配置文件来组织的。 首先,它里面有个节(section) [global] ,里面保存了一些全局使用的数据;而其他的一些节里面,节名会对应了一个共享名,比方说我添加了一个节名[users],他就自动对应了一个 users 的共享目录了。那么这个节下面应该有些什么 key 和 value 呢(才算有效的共享目录配置),这就是下面我将要描述的。
在继续下一步之前,我建议大家先备份当前的 smb.conf ,请执行 "cd /etc/samba; tar cvzf org_smb.conf.tar.gz smb.conf" 。 要恢复,那请执行命令行 "tar xvzf org_smb.conf.tar.gz"。
② 把 global 里面多余的项都屏蔽掉(该行最前面加#字符),只留低下面四行(没有的请自行加上去),完成后的样子应如下。
[global]
workgroup = TUX-NET #
server string = redhat.EL,v4 Samba Server # 随便填
map to guest = Bad User # 如用guest方式登陆将免问密码
guest account = root # 扩大guest用户的权限为root的权限
√ 注:上面提到的 root 用户是指 smb用户列表里的那个root用户。
③ 下面将创建一个共享名为 users 的共享目录,映射了Linux文件系统下的 /home 目录相对应。
请编辑 "/etc/samba/smb.conf" ,添加下面一节内容( 不同Key对应的详细说明请看注释)
[users]
comment = All users # 请随意
path = /home # 指定要共享出来的目录路径
read only = No # 是否只读共享吗
create mask = 0666 # 涉及到新建文件的,创建后对应权限码
directory mask = 0765 # 类似上面,不过这次是指目录
public = yes # 共享目录名是隐藏还是公开的
√ 这样,在打开 samba 服务后,在Window 里将预期看到有 //xx.xx.xx.ip/users 这样的共享目录了。
④ 修改好配置后,需要重新启动 samba 服务才能够使配置生效,请键入 "service smb restart" (注意观察提示输出),成功了吗?
如果成功,那么随便用一个 Windows 远程访问该台 Linux 的共享目录看看。 在 IE 地址栏输入 "//xx.xx.xx.xx" ,是不是可以看到 users 这个共享目录了呢?
-- 如果提示输入用户名和密码,用户请输入 local/root ,然后对应密码,点确定。
访问共享目录里就能够得到你想要摆弄的 Linux 里的文件了,是不是能感受到这方便所带来的喜悦呢?
⑤ 要么再极端一点吧,你甚至连密码都不想输入了,那么请你给 [users] 节多加一个 "guest ok = yes" 这样的 key 和 value ,完整的节内容请参考其下
[users]
comment = All users # 请随意
path = /home # 指定要共享出来的目录路径
read only = No # 是否只读共享吗
create mask = 0666 # 涉及到新建文件的,创建后对应权限码
directory mask = 0765 # 类似上面,不过这次是指目录
public = yes # 共享目录名是隐藏还是公开的
guest ok = yes # 指定用 guest 方式来访问
√ 同样的需要重新启动 samba 服务才能让配置生效,请尝试一下各种操作,能够在共享目录中新建,修改,复制,删除等等一系列活动,看看会怎么样?(不输密码是不是要更爽一点)
( 如果 Windows 提示同一个服务不能打开两次之类的提示,请注销你的 Windows 用户重新登入,然后再重试即可。)
另外请注意,Section 名不要重复!!
-- 时间关系,我这里就不把配置项都说的那么仔细了,上述key已足够用已。读者如果感兴趣,可以搜索一下网文 "鸟哥的私房菜",里面有较详细的描述。
● Windows 方需要设置什么
○ 关键点是映射网络磁盘的命令
虽说是关键点,但无须多讲,一条命令搞掂。先找一个目前所没有使用的盘符,比如 S 盘。
"D:/WINXP/system32/net.exe" use S: //172.16.100.110/users 123456 /USER:local/root /PERSISTENT:NO
如果没有出错提示的,请打开我的电脑,察看 S 盘这个盘符里面的内容。确认一下是否就是你 172.16.100.110 那台远程主机的 /home 目录里的内容?
○ 安装好 SourceInsight,然后作一些简单设置:
字体大小和文字对齐方式,也就是选择一种可以上下行完美对齐的文体(默认文体是长短不一的美术字体)。
-- 请点选 "Options" -> "preferences.." ,然后选中 "Syntax Decorations" TAB页里的 "Doc Types...",得到一个配置页。
让坐上方的 Document Type: 里选中 "C Source File" 和在 Screen Fonts.: 里选中 "Courier New 9" 字体;
右下方的 "Expand tabs" 和 "Show line numbers" 前方的方框里打上 √ , 最后点选 Close 即可。
SourceInsight 的使用起步比较简单,这里就不一步一步赘述了,无非就是创建空的工程,然后添加所有源文件,最后 Rebuild 一下工程而已。请各位多试几遍。
通常情况下 SourceInsight 会默认建有一个叫 Base 的工程,请不要随意删除或者人为改动它,否则后果请自负。
○ putty 的实用方法介绍
putty 较为值得推荐,因为它轻量级(不需安装),命令行支持,界面友好,使用极其方便。
从网上下载得到 putty.exe 以后,直接把它放到 Windows 系统目录下。这样,就随时随地可以使用 "Windows键+R" 来运行 putty 登陆到其他Linux服务器上了。
登陆到刚才所说的那个服务器也是只需要一条命令:
putty -pw 123456 [email protected]
默认的 SSH 端口使用 22 ,如果这个端口被改变了,可以利用(大写的) -P 参数来重新指定。
更完整的命令应该如下:
putty -2 -ssh -P 2222 -pw 123456 [email protected]
请读者自行摸索一下,其他我也不再多说了。
○ indent 的使用介绍正如上面所介绍的 indent.em 的安装,请参考上面的叙述。
另外还有值得推荐的 Windows 下小软件是 BeyondCompare 。这是一个基于文本的比较工具,两个版本的同一个源文件究竟改动了哪里?一目了然,也是个不可或缺的好工具!
还有 TortoiseCVS (或TortoiseSVN) 这个版本控制软件,一般上规模项目的开发者都认识它。
● HelloWorld 演示
什么都从最简单的开始,HelloWorld 够经典了吧。
从Win系统里登陆到服务器,创建 /home/src/HelloWorld 目录,在这个目录下 "touch main.c" 出来。
调出你的 SourceInsight ,创建一个名为 "HelloWorld_OnS_172.16.100.110" 的工程,到添加源文件那一步,请到 "我的电脑->S:盘" 里面查找和添加上 main.c (这有点不大好,最好能直接指定工程的基目录为 "//172.16.100.110/users/src/HelloWorld" )
完成文件的添加后确定,双击 main.c 进入编辑状态,输入以下内容:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main() {
printf("Hello Linux World!/n");
return(0);
}
√ 上面 include 里面提到了一个 unistd.h 的头文件,作为 Linux 程序最好包含它, unistd 是 Unix standard 的缩写(Linux属于UNIX Like的系统)
在 SourceInsight 里面保存了之后(实际上是在Linux主机上保存了它),我们使用 putty 登陆到远程主机的 /home/src/HelloWorld 目录下,并执行 "gcc main.c" 来编译并生成可执行文件 a.out。
执行 "./a.out" 可以看到如下输出就证明你对了。
[root@rs2 tmp]# ./a.out
Hello Linux World!
[root@rs2 tmp]#
○ 恭喜您已经入门成功,如果你上面有安装 indent 的话,请再执行一下 indent 看看(注意先备份成main.c.bk )。好,再假如你安有 BeyondCompare 的话,你直接把 main.c 和 main.c.bk 进行文本比较看看!!
作为一个新手,没有吃惊吗? BeyondCompare 可以帮助我们分析像Linux内核源码那样的复杂代码,究竟两个小版本之间究竟有哪里发生了微妙变化,这样的分析工具个人认为是非常有价值的。
● 给你download的内核源码建个工程
○ 一个建议,由于内核源码十分庞大,最好都放在本地磁盘上,否则samba的网络延时会让你受不了的。
○ 对内核源码的所有 include 头文件先单独建一个工程,然后再给内核源码建立另一个工程。两个工程相互配合使用来阅读源码,个人感觉会更方便。
○ 给内核某个模块建立工程(举例:IP_VS 工程),这是另外一个建议,看内核不向看一个几百行的小程序,最好从它当中的一个功能完整的小模块开始入手,我建议用集成到 2.6 内核里的 LVS 模块的源码作为入手,代码量也不大(更重要的LVS模块创始人是中国的,章文嵩博士)。
头文件在内核源码(包)的 "省略../linux-2.6.20.3/include/net/ip_vs.h" 中,不要漏掉了。其余源文件均在 "省略../Kernel_src/linux-2.6.20.3/net/ipv4/ipvs" ,请用这些源文件构建一个工程。
--- 一个苦恼是,Linux文件系统对文件名大小写是敏感的,但Win32系统却相反,导致在包含内核源码中某些文件的时候出错。
举例说明: xt_CONNMARK.c 和 xt_connmark.c 在 Linux 里被认为是两个文件,但在 Win32 系统中却误以为是同一个文件。最好把 xt_connmark.c 改为 xt_connmark(1).c 以示区别。
不过对于这样的环境组合所带来的便利来说,这点小节还是可以忍受的。
● 题外话
使用虚拟机! 有什么好处?代价呢?
哈,如果你有个习惯是从文章的最后开始看的,那么你就比较幸运了。这里提供了一个解决方案,可以让你的 Windows 里有 Linux ,Linux 里有 Windows ,总之让你无所不能,只要你还有想象力(和足够多的内存)。
我的所有工作都是在一台机器上完成的,网络是虚拟的(所以Samba访问基本上没感觉到延时),不需要我机器要有真正的物理网卡,不用担心Linux 重编内核后起不来了,因为我可以重新拷贝一份磁盘镜像就可以重用了(当然需要事先备份咯)。所谓远程的 Linux 也在我本地硬盘上跑着,这都归功于 VMware 这款软件。唯一的代价是,我必须要有 512以上的内存和2G以上的CPU!
VMware 有多个平台版本,我可以在 Windows 下创建虚拟机,也可以在 Linux 下创建虚拟机。尤其是在 Linux 下创建虚拟机(Linux运行效率较高),因为服务器的性能和资源都比较多,通常可以把一台服务器拆成N个Linux 远程主机来用,能解决了项目组内研发服务器紧缺的难题(每人独占一个远程主机)。
关于 VMware 的使用说明网上很多,请自己搜集相关资料,我目前应用的版本是 VMware Server 1.0.1 build-29996 。
以下是 VMware 的 Linux 下版本的下载路径 (RPM格式)
"http://download3.vmware.com/software/vmserver/VMware-server-1.0.1-29996.i386.rpm"
----------------------------------------------------------------------------------------------------------------------------------------------------------
我个人的macro格式