海风的Linux开发环境介绍

 

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格式

 

你可能感兴趣的:(linux)