﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-Daywei0123-随笔分类-Linux</title><link>http://www.cppblog.com/Daywei0123/category/18866.html</link><description>技术追求卓越 梦想创造未来</description><language>zh-cn</language><lastBuildDate>Sun, 11 Sep 2016 16:31:46 GMT</lastBuildDate><pubDate>Sun, 11 Sep 2016 16:31:46 GMT</pubDate><ttl>60</ttl><item><title>CMake使用</title><link>http://www.cppblog.com/Daywei0123/archive/2016/09/11/214272.html</link><dc:creator>Daywei</dc:creator><author>Daywei</author><pubDate>Sun, 11 Sep 2016 14:52:00 GMT</pubDate><guid>http://www.cppblog.com/Daywei0123/archive/2016/09/11/214272.html</guid><wfw:comment>http://www.cppblog.com/Daywei0123/comments/214272.html</wfw:comment><comments>http://www.cppblog.com/Daywei0123/archive/2016/09/11/214272.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Daywei0123/comments/commentRss/214272.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Daywei0123/services/trackbacks/214272.html</trackback:ping><description><![CDATA[<p><strong>cmake学习（一）静态库与动态库构建</strong> </p>
<p>(.so)共享库，shared object：节省空间，在运行时去连接，如果执行机器上没有这些库文件就不能执行。<br />(.a)静态库,archive：静态库和程序化为一体，不会分开。<br />通过 ldd命令可以查看一个可执行程序所依赖的的共享库。<br />使用环境变量LD_LIBRARY_DIRECTORY可以指定共享库位置</p>
<p><br />一、编译共享库： <br />ADD_LIBRARY(hello SHARED ${SHARED_LIBRARY})</p>
<p>二、添加静态库：<br />ADD_LIBRARY(hello STATIC ${STATIC_LIBRARY})<br />因为默认规则是不能有相同名字的共享库与静态库，所以当生成静态库的时候（so后缀），共享库会被删除，因为只能允许一个名字存在，相同名字的会被替代（hello），所以需要通过SET_TARGET_PROPERTIES()来解决这个问题，例子：<br />SET_TARGET_PROPERTIES(hello_static PROPERTIES OUTPUT_NAME "hello")<br />cmake在构建一个target的时候，会删除之前生成的target，一样是通过设置SET_TARGET_PROPERTIES(hello PROPERTIES CLEAN_DIRECT_OUTPUT 1)来达到目的<br />三、动态库的版本号：<br />同样是通过SET_TARGET_PROPERTIES()来设置<br />SET_TARGET_PROPERTIES(hello PROPERTIES VERSION 1.2 SOVERSION 1)<br />VERSION：动态库版本<br />SOVERSION：API版本<br />最后生成的结果是：<br />libhello.so.1.2<br />libhello.so.1-&gt;libhello.so.1.2<br />libhello.so-&gt;libhello.so.1<br />四、安装：<br />INSTALL(TARGETS hello hello_static <br />LIBRARY DESTINATION lib<br />ARCHIVE DESTINATION lib)<br />INSTALL(TARGETS hello.h<br />DESTINATION include/hello)<br />其他常用的属性 PERMISSIONS：设置权限；RATTERN：设置正则表达式</p>
<p><br />Summary:<br />ADD_LIBRARY()：添加一个库，共享库，静态库，模块<br />SET_TARGET_PROPERTIES()：设置输出名称，版本号，解决相同target被删除的问题<br />GET_TARGET_PROEERTIES()：与SET功能相对</p>
<p><strong>cmake学习（二）常用变量和常用环境变量</strong> <br />一、变量的引用方式是使用&#8220;${}&#8221;，在IF中，不需要使用这种方式，直接使用变量名即可 <br />二、自定义变量使用SET(OBJ_NAME xxxx)，使用时${OBJ_NAME}<br />三、cmake的常用变量：<br />CMAKE_BINARY_DIR,PROJECT_BINARY_DIR,_BINARY_DIR：<br />这三个变量内容一致，如果是内部编译，就指的是工程的顶级目录，如果是外部编译，指的就是工程编译发生的目录。<br />CMAKE_SOURCE_DIR,PROJECT_SOURCE_DIR,_SOURCE_DIR：<br />这三个变量内容一致，都指的是工程的顶级目录。<br />CMAKE_CURRENT_BINARY_DIR：外部编译时，指的是target目录，内部编译时，指的是顶级目录<br />CMAKE_CURRENT_SOURCE_DIR：CMakeList.txt所在的目录<br />CMAKE_CURRENT_LIST_DIR：CMakeList.txt的完整路径<br />CMAKE_CURRENT_LIST_LINE：当前所在的行<br />CMAKE_MODULE_PATH：如果工程复杂，可能需要编写一些cmake模块，这里通过SET指定这个变量<br />LIBRARY_OUTPUT_DIR,BINARY_OUTPUT_DIR：库和可执行的最终存放目录<br />PROJECT_NAME：你猜~~</p>
<p>&nbsp;</p>
<p>四、cmake中调用环境变量<br />1.Using $ENV{NAME} : invoke system environment varible.<br />We can use "SET(ENV{NAME} value)" as well. note that the "ENV" without "$".<br />2.CMAKE_INCLUDE_CURRENT_DIR equal to INCLUDE_DIRECTORY(${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR})</p>
<p><br />五、其他的内置变量<br />1.BUILD_SHARED_LIBS:set the default value when using ADD_LIBRARY()<br />2.CMAKE_C_FLAGS: set compiler for c language<br />2.CMAKE_CXX_FLAGS: set compiler for c++ language</p>
<p><br />六、区分debug和release<br />在工程目录下，cmake -DCMAKE__BUILD_TYPE=DEBUG(RELEASE)，再执行make</p>
<p><br />七、指定编译32bit或64bit程序<br />SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -m32")<br />SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -m32")<br /><br /><span style="white-space: normal; word-spacing: 0px; text-transform: none; float: none; color: rgb(129,151,176); text-align: left; font: 300 18px/20px 微软雅黑, 黑体; widows: 1; display: inline !important; letter-spacing: normal; background-color: rgb(0,0,0); text-indent: 0px; -webkit-text-stroke-width: 0px">cmake学习（三）常用指令</span><br /></p>
<p>一、基本指令：<br />INCLUDE_DIRECTORIES(${includedir}) #-I。<br />LINK_DIRECTORIES(${libdir}) #-L<br />TARGET_LINK_LIBRARIES(helloworld ${linkflags}) #-l<br />ADD_DEFINITIONS(${cflags}) #-D<br />&nbsp;<br />1、ADD_DEFINATIONS：向C/CPP添加宏定义，相当于gcc中的-D，参数之间用空格分割<br />2、ADD_DEPENDICIES(target_name, depend_name)：定义target对其他target的依赖关系<br />3、AUX_SOURCE_DIRECTORY(dir VARIBLE)：把目录下的所有源文件保存在变量中，基本用来创建源文件列表<br />4、ADD_EXECUTABLE：指定目录，生成执行文件<br />5、EXEC_PROGRAM：外部调用指令，可移执行任何外部命令，后面加参数，例子如下：<br />EXEC_PROGERAM(ls ARGS"*.c" OUTPUT_VARIBLE LS_OUTPUT RETURN_VALUE LS_RVALUE)<br />IF(not LS_RVALUE)<br />MESSAGE(STATUS "xxx")<br />ENDIF(not LS_RVAULE)<br />PS.这里执行ls *.c指令，执行成功的话，返回0。<br />6、FILE指令：<br />FILE(WRITE file_name "content")<br />FILE(APPEND file_name "content")<br />FILE(READ file_name varible)<br />FILE(WRITE file_name "content")<br />7、FIND_系列指令：<br />LIBRARY( name path)：<br />FIND_LIBRARY(Xorg X11 /usr/lib64)<br />IF(not Xorg)<br />MESSAGE(STATUS "no Xorg")<br />ENDIF(not Xorg)<br />FILE( name path)<br />PATH( name path)<br />PROGRAM( name path)<br />PACKAGE( [major.minor][QUIET][NO MODULE][[REQUIRED][COMPONTS][componts....]])<br />最后一条，用来调用放在CMAKE_MODULE_PATH下的Find.cmake模块，也可以自定义Find模块<br />首先通过SET(CMAKE_MODULE_PATH /home/...)来指定位置</p>
<p>8、控制指令：<br />IF(expression)，ELSE(expression)，ENDIF(expression)<br />express举例：<br />否定：空，0，N，NO，OFF，FALSE，NOTFOUND或_NOTFOUND<br />肯定：COMMAND cmd，EXISTS dir/file，variable MARCHES regex等等等等还有很多~~~随用随查吧</p>
<p><br /><strong>cmake学习（四）模块的使用和自定义模块<br /></strong></p>
<p>FIND_PACKAGE<br />每一个模块都会产生如下变量<br />_FOUND<br />_INCLUDE_DIR<br />_LIBRARY or _LIBRARIES<br />如果_FOUND为真，把_INCLUDE_DIR加入到INCLUDE_DIRECTORIES中，_LIBRARY加入到TARGET_LINK_LIBRARIES中。</p>
<p>编写属于自己的FindHello模块：<br />1.FIND_PATH(HELLO_INCLUDE_DIR hello.h /usr/include/hello /usr/local/include/hello)<br />2.FIND_LIBRARY(HELLO_LIBRARY_DIR NAMES hello PATH /usr/lib /usr/local/lib)<br />&nbsp; IF(HELLO_INCLUDE_DIR AND HELLO_LIBRARY)<br />&nbsp; SET(HELLO_FOUND TRUE)<br />&nbsp; ENDIF(HELLO_INCLUDE_DIR)<br />3.FIND_PACKAGE([major.minor][QUIET][NO_MODULE]<br />[[REQUIRED|COMPONENTS][componets...]])<br />QUIET参数：去掉输出信息<br />REQUIRED参数：共享库是否是工程必须的，如果是必须的，那么找不到<br />如果在src中想调用hello模块中的内容<br />FIND_PACKAGE(HELLO)<br />为了可以让工程找到FindHELLO.cmake<br />在主工程的CMakeList.txt中，SET(CMAKE_MODULE_PATH ${PROJECT_SOURCE_PATH}/cmake)<br />通过设置FIND_PACKAGE(HELLO QUIET)可以去掉输出信息<br /><br /><a style="text-decoration: none; white-space: normal; word-spacing: 0px; text-transform: none; color: rgb(0,0,0); text-align: left; font: 20px/30px 'Microsoft YaHei'; widows: 1; letter-spacing: normal; background-color: rgb(255,255,255); text-indent: 0px; -webkit-text-stroke-width: 0px" href="http://blog.csdn.net/colddie/article/details/8264883">Cmake CMAKE_BUILD_TYPE specification</a><br /></p><pre style="font-size: 14px; word-wrap: break-word; font-variant: normal; white-space: pre-wrap; word-spacing: 0px; text-transform: none; font-weight: normal; color: rgb(51,51,51); font-style: normal; text-align: left; widows: 1; letter-spacing: normal; line-height: 26px; background-color: rgb(255,255,255); text-indent: 0px; -webkit-text-stroke-width: 0px"><p style="font-size: 1.05em; color: rgb(51,51,51); text-align: justify; line-height: 16px"><span style="font-family: Verdana">That&#8217;s because no build type has been specified to CMake. The build type is a feature most IDE have, it allows you to compile your program in &#8220;debug&#8221; mode, for easily single-stepping through it with a debugger, or in &#8220;release&#8221; mode, with speed optimization enabled.</span></p><p style="font-size: 1.05em; color: rgb(51,51,51); text-align: justify; line-height: 16px"><span style="font-family: Verdana">To fix this you simply need to specify a build type in the CMakeLists.txt file, in this way:</span></p><span style="font-family: Verdana">
</span></pre><pre style="font-size: 14px; word-wrap: break-word; font-variant: normal; white-space: pre-wrap; word-spacing: 0px; text-transform: none; font-weight: normal; color: rgb(51,51,51); font-style: normal; text-align: left; widows: 1; letter-spacing: normal; line-height: 26px; background-color: rgb(255,255,255); text-indent: 0px; -webkit-text-stroke-width: 0px"><pre style="word-wrap: break-word; white-space: pre-wrap"></pre><br /></pre><pre style="font-size: 14px; word-wrap: break-word; font-variant: normal; white-space: pre-wrap; word-spacing: 0px; text-transform: none; font-weight: normal; color: rgb(51,51,51); font-style: normal; text-align: left; widows: 1; letter-spacing: normal; line-height: 26px; background-color: rgb(255,255,255); text-indent: 0px; -webkit-text-stroke-width: 0px">if( NOT CMAKE_BUILD_TYPE )
  set( CMAKE_BUILD_TYPE Debug CACHE STRING
       "Choose the type of build, options are: None Debug Release RelWithDebInfo
MinSizeRel."
       FORCE )
endif()</pre><pre style="font-size: 14px; word-wrap: break-word; font-variant: normal; white-space: pre-wrap; word-spacing: 0px; text-transform: none; font-weight: normal; color: rgb(51,51,51); font-style: normal; text-align: left; widows: 1; letter-spacing: normal; line-height: 26px; background-color: rgb(255,255,255); text-indent: 0px; -webkit-text-stroke-width: 0px"><pre style="word-wrap: break-word; white-space: pre-wrap"><span style="font-family: Verdana">
</span></pre><pre style="word-wrap: break-word; white-space: pre-wrap"><span style="font-family: Verdana">when cmake is run without specifying the build type using -D CMAKE_BUILD_TYPE, it is the Debug mode that is selected as the default.</span></pre></pre>
<p><span style="white-space: normal; word-spacing: 0px; text-transform: none; float: none; color: rgb(129,151,176); text-align: left; font: 300 18px/20px 微软雅黑, 黑体; widows: 1; display: inline !important; letter-spacing: normal; background-color: rgb(0,0,0); text-indent: 0px; -webkit-text-stroke-width: 0px"><br /></span>&nbsp;</p><img src ="http://www.cppblog.com/Daywei0123/aggbug/214272.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Daywei0123/" target="_blank">Daywei</a> 2016-09-11 22:52 <a href="http://www.cppblog.com/Daywei0123/archive/2016/09/11/214272.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>vim使用总结ing</title><link>http://www.cppblog.com/Daywei0123/archive/2013/04/06/199143.html</link><dc:creator>Daywei</dc:creator><author>Daywei</author><pubDate>Sat, 06 Apr 2013 04:12:00 GMT</pubDate><guid>http://www.cppblog.com/Daywei0123/archive/2013/04/06/199143.html</guid><wfw:comment>http://www.cppblog.com/Daywei0123/comments/199143.html</wfw:comment><comments>http://www.cppblog.com/Daywei0123/archive/2013/04/06/199143.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Daywei0123/comments/commentRss/199143.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Daywei0123/services/trackbacks/199143.html</trackback:ping><description><![CDATA[<div><strong><span>VIM官网：<br /><div><a href="http://www.vim.org/">http://www.vim.org/</a><br /><span>里面已经包含了很多插件，可随意配置。</span></div></span><span>先是一些</span><span>vim</span><span>基本配置</span><span>设置</span><span><br /><br /></span></strong><strong><span>vim</span></strong><strong><span>语法高亮显示和自动缩进</span></strong> <div><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></div> <div><strong><span>1</span></strong><strong><span>、配置文件的位置</span></strong></div> <div>在目录 /etc/ 下面，有个名为<strong>vimrc</strong>的文件，这是系统中公共的vim配置文件，对所有用户都有效。而在每个用户的主目录下，都可以自己建立私有的配置文件，命名为：&#8220;<strong><span>.</span></strong><strong>vimrc</strong>&#8221;。例如，/root目录下，通常已经存在一个<strong><span>.</span></strong><strong>vimrc</strong>文件。</div> <div>&nbsp;&nbsp;&nbsp; <strong><span>2</span></strong><strong><span>、设置语法高亮显示</span></strong></div> <div>1) 打开vimrc，添加以下语句来使得语法高亮显示：</div> <div><span>syntax on</span></div> <div>2) 如果此时语法还是没有高亮显示，那么在/etc目录下的profile文件中添加以下语句：</div> <div><span>export TERM=xterm-color</span></div> <div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </div> <div>&nbsp;&nbsp;&nbsp; <strong><span>3</span></strong><strong><span>、设置</span></strong><strong><span>Windows</span></strong><strong><span>风格的</span></strong><strong><span>C/C++</span></strong><strong><span>自动缩进（添加以下</span></strong><strong><span>set</span></strong><strong><span>语句到</span></strong><strong><span>vimrc</span></strong><strong><span>中）</span></strong></div> <div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1）设置（软）制表符宽度为4：</div> <div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span>set tabstop=4</span></div> <div><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; set softtabstop=4</span></div> <div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2）设置缩进的空格数为4</div> <div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span>set shiftwidth=4</span></div> <div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3）设置自动缩进：<span>即每行的缩进值与上一行相等；使用</span><span> noautoindent </span><span>取消设置：</span></div> <div><span>set autoindent</span></div> <div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4）<span>设置</span><span>使用</span><span> C/C++ </span><span>语言的自动缩进方式：</span></div> <div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span>set cindent</span></div> <div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5）设置C/C++语言的具体缩进方式（以我的windows风格为例）：</div> <div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span>set cinoptions={0,1s,t0,n-2,p2s,(03s,=.5s,&gt;1s,=1s,:1s</span></div> <div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 6）如果想在左侧显示文本的行号，可以用以下语句：</div> <div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span>set nu</span></div> <div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 7）最后，如果没有下列语句，就加上吧：</div> <div><span>if &amp;term=="xterm"</span></div> <div><span>set t_Co=8</span></div> <div><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; set t_Sb=^[[4%dm</span></div> <div><span>set t_Sf=^[[3%dm</span></div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span>endif<br /></span><strong><span><br /></span></strong><strong><span>安装ctags+taglist</span></strong><br /> <blockquote><div>1.ctags<br />（1）到<a href="http://ctags.sourceforge.net/" target="_blank">http://ctags.sourceforge.net/</a>下载ctags源码ctags-5.6.tar.gz<br /><a href="http://prdownloads.sourceforge.net/ctags/ctags-5.6.tar.gz" target="_blank">http://prdownloads.sourceforge.net/ctags/ctags-5.6.tar.gz</a><br />（2）解压并安装<br />tar zxvf ctags-5.6.tar.gz<br />cd ctags-5.6<br />./configure &amp;&amp; make &amp;&amp; make install<br />（3）使用<br />[/home/brimmer/src]$ ctags -R<br /><br />"-R"表示递归创建，也就包括源代码根目录下的所有子目录下的源程序。"tags"文件中包括这些对象的列表：<br />l 用#define定义的宏<br />l 枚举型变量的值<br />l 函数的定义、原型和声明<br />l 名字空间（namespace）<br />l 类型定义（typedefs）<br />l 变量（包括定义和声明）<br />l 类（class）、结构（struct）、枚举类型（enum）和联合（union）<br />l 类、结构和联合中成员变量或函数<br />VIM用这个"tags"文件来定位上面这些做了标记的对象，下面介绍一下定位这些对象的方法：<br /><br />1) 用命令行。在运行vim的时候加上"-t"参数，例如：<br />[/home/brimmer/src]$ vim -t foo_bar<br />这个命令将打开定义"foo_bar"（变量或函数或其它）的文件，并把光标定位到这一行。<br />2) 在vim编辑器内用":ta"命令，例如：<br />:ta foo_bar<br />3) 最方便的方法是把光标移到变量名或函数名上，然后按下"Ctrl-]"。用"Ctrl-o"退回原来的地方。<br />注意：运行vim的时候，必须在"tags"文件所在的目录下运行。否则，运行vim的时候还要用":set tags="命令设定"tags"文件的路径，这样vim才能找到"tags"文件。<br /><br />在函数中移动光标<br />[{ 转到上一个位于第一列的"{"<br />}] 转到下一个位于第一列的"{"<br />{ 转到上一个空行<br />} 转到下一个空行 （[ and ] 也分别是两个指令）<br />gd 转到当前光标所指的局部变量的定义<br />* 转到当前光标所指的单词下一次出现的地方<br /># 转到当前光标所指的单词上一次出现的地方<br />Vim 的创造者是一名计算机程序员，因此这就不奇怪 Vim 中有许多帮助编写程序的功能：<br />跳转到标识符被定义和使用的地方；在另一个窗口中预览有关的声明等等。<br />（ctags使用部分参考了 文章&#8220;ctags和vim&#8221;，原文在<br /><a href="http://hi.baidu.com/original/blog/item/2cf8d53f00b7fcc27d1e71f0.html" target="_blank">http://hi.baidu.com/original/blog/item/2cf8d53f00b7fcc27d1e71f0.html</a>，<br />更多使用也请参考原文）<br /><br /><br />2. taglist<br />能够列出源文件中的tag(function, class, variable, etc)并跳转.<br />注意：taglist依赖于ctags，所以要先装ctags，否则taglist装了也没法用！<br />（1）到<a href="http://vim.sourceforge.net/scripts/script.php?script_id=273" target="_blank">http://vim.sourceforge.net/scripts/script.php?script_id=273</a><br />下载taglist_42.zip，即<br /><a href="http://vim.sourceforge.net/scripts/download_script.php?src_id=6416" target="_blank">http://vim.sourceforge.net/scripts/download_script.php?src_id=6416</a><br />（2）解压得到两个文件<br /># unzip -d taglist taglist_42.zip<br /># cd taglist<br /># tree<br />.<br />|-- doc<br />| `-- taglist.txt <br />`-- plugin<br />`-- taglist.vim<br />（3）安装<br />cp doc/taglist.txt /usr/share/vim/vim61/doc/<br />cp plugin/taglist.vim /usr/share/vim/vim61/plugin/<br />（4）配置和使用<br />cd /usr/share/vim/vim61/doc/<br />启动vim，用 &#8220;:helptags .&#8221;来配置好帮助文件<br />重启vim，用&#8220;:TlistToggle&#8221;来打开和关闭taglist窗口。<br />可以用&#8220;:help taglist&#8221;来获得更多帮助信息</div> <br />set tags=./tags,./../tags,./http://www.cnblogs.com/tags,./**/tags<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />let Tlist_Use_Left_Window=1<br />let Tlist_Auto_Update=1<br />let Tlist_Exit_OnlyWindow=1<br />let Tlist_Show_One_File=1<br />nmap &lt;F7&gt; :TlistToggle &lt;CR&gt;</blockquote></div><span style="font-size: 14pt; color: #000000;">其次安装配置基本的插件</span><br /><blockquote><div><span>1.安装好Vim和Vim的基本插件。在ubuntu下这些使用apt-get安装即可：</span><br /> <span>lingd@ubuntu:~/arm$sudo apt-get install vim vim-scripts vim-doc</span><br /> <span>其中vim-scripts是vim的一些基本插件，包括语法高亮的支持、缩进等等。</span><br /> <span>vim中文帮助文档tar包下载地址:</span><br /> <span>http://sourceforge.net/projects/vimcdoc/files/vimcdoc/</span><br /> <span>解压后其中有个doc文件夹, 将其中的内容全部复制到~/.vim/doc, 或者vim安装目录下的doc目录中, 此时vim中的help信息已经是中文的了.</span><br /> <span>网页版中文帮助文档网址http://vimcdoc.sourceforge.net/doc/help.html</span><br /> <span>首页就时vim帮助文档的目录，阅读起来更方便有效、更有针对性！</span></div><br /><div>2.管理vim插件&#8212;&#8212;vim-addons<br /><div>通过vim-addons，我们可以管理vim插件。我们在sudo apt-get install vim vim-scripts  vim-doc时，一般会自动安装上vim-addons。若未安装可通过sudo apt-get install  vim-addon-manager手动安装。安装完成后，就可以用vim-addons管理vim插件了。<br /> # 系统中已有的vim-scripts中包含的插件及其状态：<br /> lingd@ubuntu:~$ vim-addons status<br /> # Name&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; User Status&nbsp; System Status<br /> align&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; removed&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; removed&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /> alternate&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; removed&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; removed&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /> bufexplorer&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; removed&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; removed&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /> calendar&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; removed&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; removed&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /> closetag&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; removed&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; removed&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /> colors sampler pack&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; removed&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; removed&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /> cvsmenu&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; removed&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; removed&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /> debPlugin&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; removed&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; removed&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /> detectindent&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; removed&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; removed&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /> doxygen-toolkit&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; removed&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; removed&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /> editexisting&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; removed&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; removed&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /> enhanced-commentify&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; removed&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; removed&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /> gnupg&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; removed&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; removed&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /> info&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; removed&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; removed&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /> justify&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; removed&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; removed&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /> lbdbq&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; removed&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; removed&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /> markdown-syntax&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; removed&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; removed&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /> matchit&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; removed&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; removed&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /> minibufexplorer&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; installed&nbsp;&nbsp;&nbsp;&nbsp; removed&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /> nerd-commenter&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; removed&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; removed&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /> omnicppcomplete&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; installed&nbsp;&nbsp;&nbsp;&nbsp; removed&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /> po&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; removed&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; removed&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /> project&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; installed&nbsp;&nbsp;&nbsp;&nbsp; removed&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /> python-indent&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; removed&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; removed&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /> secure-modelines&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; removed&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; removed&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /> snippetsEmu&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; removed&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; removed&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /> sokoban&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; removed&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; removed&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /> supertab&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; removed&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; removed&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /> surround&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; removed&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; removed&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /> taglist&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; installed&nbsp;&nbsp;&nbsp;&nbsp; removed&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /> tetris&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; removed&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; removed&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /> utl&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; removed&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; removed&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /> vcscommand&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; removed&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; removed&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /> vimplate&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; removed&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; removed&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /> whatdomain&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; removed&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; removed&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /> winmanager&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; removed&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; removed&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /> xmledit&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; removed&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; removed&nbsp;&nbsp;&nbsp;</div></div></blockquote><br /><br /><br /><br /><em>Reference：</em><br /><a title="vim配置为C/C++开发环境 " href="http://blog.csdn.net/shexinwei/article/details/6844043">vim配置为C/C++开发环境 </a><br /><a href="http://blog.csdn.net/klarclm/article/details/7932558" title="一步步将vim改造成C/C++开发环境(IDE) ">一步步将vim改造成C/C++开发环境(IDE) </a><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<img src ="http://www.cppblog.com/Daywei0123/aggbug/199143.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Daywei0123/" target="_blank">Daywei</a> 2013-04-06 12:12 <a href="http://www.cppblog.com/Daywei0123/archive/2013/04/06/199143.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Linux下C/C++学习4——程序调试</title><link>http://www.cppblog.com/Daywei0123/archive/2012/04/04/170048.html</link><dc:creator>Daywei</dc:creator><author>Daywei</author><pubDate>Wed, 04 Apr 2012 06:26:00 GMT</pubDate><guid>http://www.cppblog.com/Daywei0123/archive/2012/04/04/170048.html</guid><wfw:comment>http://www.cppblog.com/Daywei0123/comments/170048.html</wfw:comment><comments>http://www.cppblog.com/Daywei0123/archive/2012/04/04/170048.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Daywei0123/comments/commentRss/170048.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Daywei0123/services/trackbacks/170048.html</trackback:ping><description><![CDATA[gcc编译的几种错误信息及其解决方法<br />1.语法错误<br />&nbsp;&nbsp; 一般实在输入代码时括号不匹配或者使用了关键字。遇到语法错误，可以仙剑次错误提示中出现的第一个行号，如果该行没有问题，就检查该行所开始的语法模块是否完整，然后修正该结构。<br />2.头文件错误<br />&nbsp;&nbsp; 如果编译器出的错误提示说can not find include file ***.h，就说明是指定的包含文件有问题，系统在编译过程中找不到指定的头文件<br />3.类库错误<br />&nbsp;&nbsp; 如果出现类似&#8220;ld:-lm:No such file or directory&#8221;的错误，可能是在默认的目录内找不到相应的类库。这种问题的解决方法是在编译时使用-I参数指定要使用的类库所在的目录。<br />4.未定义符号<br />&nbsp;&nbsp; 出现类似Undefined symbol 的提示，说明在编译过程中发现了没有被定义的符号变量<br /><br />gdb简介<br />gdb 程序名<br />gdb <br />这两种方式均可进入gdb的交互式调试界面。在交互模式中可以使用许多命令：<br /><ul><li>file；加载要调试的程序</li><li>kill；终止正在调试的程序</li><li>list；列出10行程序的源代码</li><li>next；单步执行程序</li><li>step；单步执行程序，与next不同的是，其会进入调用的函数内部。而next只需要调用函数的结果。</li><li>run；运行加载的程序</li><li>quit；退出gdb</li><li>watch；监视一个变量的值</li><li>break；在代码里设置断点，程序运行到断点处时会停下来，然后用户可用next或step单步执行程序。但使用break的前提是程序在编译时使用了g参数</li><li>make；不用退出gdb，重新编译代码，然后在gdb中运行</li><li>shell；可调用shell命令</li><li>bt；查看函数堆栈</li><li>c函数；继续运行</li><li>finish；退出函数</li><li>info；查看相关信息，如info break<br /></li></ul><img src ="http://www.cppblog.com/Daywei0123/aggbug/170048.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Daywei0123/" target="_blank">Daywei</a> 2012-04-04 14:26 <a href="http://www.cppblog.com/Daywei0123/archive/2012/04/04/170048.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>linux下C/C++学习3——Makefile</title><link>http://www.cppblog.com/Daywei0123/archive/2012/03/26/169005.html</link><dc:creator>Daywei</dc:creator><author>Daywei</author><pubDate>Mon, 26 Mar 2012 06:56:00 GMT</pubDate><guid>http://www.cppblog.com/Daywei0123/archive/2012/03/26/169005.html</guid><wfw:comment>http://www.cppblog.com/Daywei0123/comments/169005.html</wfw:comment><comments>http://www.cppblog.com/Daywei0123/archive/2012/03/26/169005.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Daywei0123/comments/commentRss/169005.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Daywei0123/services/trackbacks/169005.html</trackback:ping><description><![CDATA[假设我们有下面这样的一个程序,源代码如下： 
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><img id="Codehighlighter1_0_11_Open_Image" onclick="this.style.display='none'; Codehighlighter1_0_11_Open_Text.style.display='none'; Codehighlighter1_0_11_Closed_Image.style.display='inline'; Codehighlighter1_0_11_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif"><img style="display: none" id="Codehighlighter1_0_11_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_0_11_Closed_Text.style.display='none'; Codehighlighter1_0_11_Open_Image.style.display='inline'; Codehighlighter1_0_11_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif"><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_0_11_Closed_Text">/**/</span><span id="Codehighlighter1_0_11_Open_Text"><span style="color: #008000">/*</span><span style="color: #008000">&nbsp;main.c&nbsp;</span><span style="color: #008000">*/</span></span><span style="color: #000000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" />#include&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">mytool1.h</span><span style="color: #000000">"</span><span style="color: #000000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" />#include&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">mytool2.h</span><span style="color: #000000">"</span><span style="color: #000000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;main(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;argc,</span><span style="color: #0000ff">char</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">**</span><span style="color: #000000">argv)<br /><img id="Codehighlighter1_86_144_Open_Image" onclick="this.style.display='none'; Codehighlighter1_86_144_Open_Text.style.display='none'; Codehighlighter1_86_144_Closed_Image.style.display='inline'; Codehighlighter1_86_144_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif"><img style="display: none" id="Codehighlighter1_86_144_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_86_144_Closed_Text.style.display='none'; Codehighlighter1_86_144_Open_Image.style.display='inline'; Codehighlighter1_86_144_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif"></span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_86_144_Closed_Text"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_86_144_Open_Text"><span style="color: #000000">{<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;mytool1_print(</span><span style="color: #000000">"</span><span style="color: #000000">hello</span><span style="color: #000000">"</span><span style="color: #000000">);<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;mytool2_print(</span><span style="color: #000000">"</span><span style="color: #000000">hello</span><span style="color: #000000">"</span><span style="color: #000000">);<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif"  alt="" />}</span></span><span style="color: #000000"><br /><img id="Codehighlighter1_146_160_Open_Image" onclick="this.style.display='none'; Codehighlighter1_146_160_Open_Text.style.display='none'; Codehighlighter1_146_160_Closed_Image.style.display='inline'; Codehighlighter1_146_160_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif"><img style="display: none" id="Codehighlighter1_146_160_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_146_160_Closed_Text.style.display='none'; Codehighlighter1_146_160_Open_Image.style.display='inline'; Codehighlighter1_146_160_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif"></span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_146_160_Closed_Text">/**/</span><span id="Codehighlighter1_146_160_Open_Text"><span style="color: #008000">/*</span><span style="color: #008000">&nbsp;mytool1.h&nbsp;</span><span style="color: #008000">*/</span></span><span style="color: #000000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" />#ifndef&nbsp;_MYTOOL_1_H<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #0000ff">#define</span><span style="color: #000000">&nbsp;_MYTOOL_1_H</span><span style="color: #000000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;mytool1_print(</span><span style="color: #0000ff">char</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">print_str);<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #0000ff">#endif</span><span style="color: #000000"><br /><img id="Codehighlighter1_246_260_Open_Image" onclick="this.style.display='none'; Codehighlighter1_246_260_Open_Text.style.display='none'; Codehighlighter1_246_260_Closed_Image.style.display='inline'; Codehighlighter1_246_260_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif"><img style="display: none" id="Codehighlighter1_246_260_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_246_260_Closed_Text.style.display='none'; Codehighlighter1_246_260_Open_Image.style.display='inline'; Codehighlighter1_246_260_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif"></span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_246_260_Closed_Text">/**/</span><span id="Codehighlighter1_246_260_Open_Text"><span style="color: #008000">/*</span><span style="color: #008000">&nbsp;mytool1.c&nbsp;</span><span style="color: #008000">*/</span></span><span style="color: #000000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" />#include&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">mytool1.h</span><span style="color: #000000">"</span><span style="color: #000000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;mytool1_print(</span><span style="color: #0000ff">char</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">print_str)<br /><img id="Codehighlighter1_319_374_Open_Image" onclick="this.style.display='none'; Codehighlighter1_319_374_Open_Text.style.display='none'; Codehighlighter1_319_374_Closed_Image.style.display='inline'; Codehighlighter1_319_374_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif"><img style="display: none" id="Codehighlighter1_319_374_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_319_374_Closed_Text.style.display='none'; Codehighlighter1_319_374_Open_Image.style.display='inline'; Codehighlighter1_319_374_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif"></span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_319_374_Closed_Text"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_319_374_Open_Text"><span style="color: #000000">{<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000">"</span><span style="color: #000000">This&nbsp;is&nbsp;mytool1&nbsp;print&nbsp;%s\n</span><span style="color: #000000">"</span><span style="color: #000000">,print_str);<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif"  alt="" />}</span></span><span style="color: #000000"><br /><img id="Codehighlighter1_376_390_Open_Image" onclick="this.style.display='none'; Codehighlighter1_376_390_Open_Text.style.display='none'; Codehighlighter1_376_390_Closed_Image.style.display='inline'; Codehighlighter1_376_390_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif"><img style="display: none" id="Codehighlighter1_376_390_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_376_390_Closed_Text.style.display='none'; Codehighlighter1_376_390_Open_Image.style.display='inline'; Codehighlighter1_376_390_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif"></span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_376_390_Closed_Text">/**/</span><span id="Codehighlighter1_376_390_Open_Text"><span style="color: #008000">/*</span><span style="color: #008000">&nbsp;mytool2.h&nbsp;</span><span style="color: #008000">*/</span></span><span style="color: #000000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" />#ifndef&nbsp;_MYTOOL_2_H<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #0000ff">#define</span><span style="color: #000000">&nbsp;_MYTOOL_2_H</span><span style="color: #000000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;mytool2_print(</span><span style="color: #0000ff">char</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">print_str);<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #0000ff">#endif</span><span style="color: #000000"><br /><img id="Codehighlighter1_476_490_Open_Image" onclick="this.style.display='none'; Codehighlighter1_476_490_Open_Text.style.display='none'; Codehighlighter1_476_490_Closed_Image.style.display='inline'; Codehighlighter1_476_490_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif"><img style="display: none" id="Codehighlighter1_476_490_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_476_490_Closed_Text.style.display='none'; Codehighlighter1_476_490_Open_Image.style.display='inline'; Codehighlighter1_476_490_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif"></span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_476_490_Closed_Text">/**/</span><span id="Codehighlighter1_476_490_Open_Text"><span style="color: #008000">/*</span><span style="color: #008000">&nbsp;mytool2.c&nbsp;</span><span style="color: #008000">*/</span></span><span style="color: #000000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" />#include&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">mytool2.h</span><span style="color: #000000">"</span><span style="color: #000000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;mytool2_print(</span><span style="color: #0000ff">char</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">print_str)<br /><img id="Codehighlighter1_549_604_Open_Image" onclick="this.style.display='none'; Codehighlighter1_549_604_Open_Text.style.display='none'; Codehighlighter1_549_604_Closed_Image.style.display='inline'; Codehighlighter1_549_604_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif"><img style="display: none" id="Codehighlighter1_549_604_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_549_604_Closed_Text.style.display='none'; Codehighlighter1_549_604_Open_Image.style.display='inline'; Codehighlighter1_549_604_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif"></span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_549_604_Closed_Text"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_549_604_Open_Text"><span style="color: #000000">{<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000">"</span><span style="color: #000000">This&nbsp;is&nbsp;mytool2&nbsp;print&nbsp;%s\n</span><span style="color: #000000">"</span><span style="color: #000000">,print_str);<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif"  alt="" />}</span></span><span style="color: #000000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /></span></div><br /><br />当然由于这个程序是很短的我们可以这样来编译<br />gcc -c main.c<br />gcc -c mytool1.c<br />gcc -c mytool2.c<br />gcc -o main main.o mytool1.o mytool2.o<br />这样的话我们也可以产生main 程序,而且也不时很麻烦.但是如果我们考虑一下如果有一天我们修改了其中的一个文件(比如说mytool1.c)那么我们难道还要重新输入上面的命令?也许你会说,这个很容易解决啊，我写一个SHELL 脚本,让她帮我去完成不就可以了.是的对于这个程序来说,是可以起到作用的，但是当我们把事情想的更复杂一点,如果我们的程序有几百个源程序的时候,难道也要编译器重新一个一个的去编译?<br />为此,聪明的程序员们想出了一个很好的工具来做这件事情,这就是make.我们只要执行以下make,就可以把上面的问题解决掉.在我们执行make 之前,我们要先编写一个非常重要的文件.--Makefile.对于上面的那个程序来说,可能的一个Makefile 的文件是：<br /># 这是上面那个程序的Makefile 文件<br />main：main.o mytool1.o mytool2.o<br />gcc -o main main.o mytool1.o mytool2.o<br />main.o：main.c mytool1.h mytool2.h<br />gcc -c main.c<br />mytool1.o：mytool1.c mytool1.h<br />gcc -c mytool1.c<br />mytool2.o：mytool2.c mytool2.h<br />gcc -c mytool2.c<br />有了这个Makefile 文件,不过我们什么时候修改了源程序当中的什么文件,我们只要执行make 命令，我们的编译器都只会去编译和我们修改的文件有关的文件,其它的文件她连理<br />都不想去理的。<br />下面我们学习Makefile 是如何编写的。<br />在Makefile 中也#开始的行都是注释行.Makefile 中最重要的是描述文件的依赖关系的说明.一般的格式是：<br />target： components<br />TAB rule<br />第一行表示的是依赖关系.第二行是规则.<br />比如说我们上面的那个Makefile 文件的第二行<br />main：main.o mytool1.o mytool2.o<br />表示我们的目标(target)main 的依赖对象(components)是main.o mytool1.o mytool2.o<br />当倚赖的对象在目标修改后修改的话,就要去执行规则一行所指定的命令.就象我们的上面那个Makefile 第三行所说的一样要执行 gcc -o main main.o mytool1.o mytool2.o<br /><strong>注意规则一行中的TAB 表示那里是一个TAB 键</strong><br />Makefile 有三个非常有用的变量.分别是<a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#36;&#64;&#44;&#36;&#94;&#44;&#36;">$@,$^,$</a>&lt;代表的意义分别是：<br />$@--目标文件,$^--所有的依赖文件,$&lt;--第一个依赖文件.<br />如果我们使用上面三个变量,那么我们可以简化我们的Makefile 文件为：<br /># 这是简化后的Makefile<br />main：main.o mytool1.o mytool2.o<br />gcc -o $@ $^<br />main.o：main.c mytool1.h mytool2.h<br />gcc -c $&lt;<br />mytool1.o：mytool1.c mytool1.h<br />gcc -c $&lt;<br />mytool2.o：mytool2.c mytool2.h<br />gcc -c $&lt;<br />经过简化后我们的Makefile 是简单了一点,不过人们有时候还想简单一点.这里我们学习一个Makefile 的缺省规则<br />..c.o：<br />gcc -c $&lt;<br />这个规则表示所有的 .o 文件都是依赖与相应的.c 文件的.例如mytool.o 依赖于mytool.c<br />这样Makefile 还可以变为：<br /># 这是再一次简化后的Makefile<br />main：main.o mytool1.o mytool2.o<br />gcc -o $@ $^<br />..c.o：<br />gcc -c $&lt;<br /><br />Makefile的处理规则<br />&nbsp;&nbsp;&nbsp;make命令在处理makefile时是递归处理的。同时，make在处理makefile时会检测目标文件与依赖文件的时间戳。这个特性降低了编译文件时的时间开销，因为其只增量编译更新过的文件。还有一点要注意的是，makefile文件必须以makefile或Makefile为名。<br />对简单Makefile文件的扩充<br />&nbsp;&nbsp;&nbsp;Makefile文件就像是一种小型的脚本语言，所以其也支持变量的定义，而灵活使用变量，可以增强Makefile的适应性与灵活性。下面是一个使用变量的Makefile。<br />
<hr />
##########################################<br />NAME = myfirst<br />cc = gcc<br />ac = as<br />CFLAG = -Wall -o1 -g<br />#这是编译源程序的编译选项，具体含义可参见前面gcc参数介绍<br />${NAME} asfile : ${NAME}.o asfile.o<br />#使用变量时，应该使用$提取符，然后用大括号将变量名括起来<br />&nbsp;${cc} ${CFLAG} ${NAME}.o -o ${NAME}<br />&nbsp;${cc} ${CFLAG} asfile.o -o asfile<br />${NAME}.o : ${NAME}.c<br />&nbsp;${cc} -c ${NAME}.c -o ${NAME}.o<br />asfile.o : ${NAME}.s<br />&nbsp;${ac} ${NAME}.s -o asfile.o<br />#由汇编代码生成目标文件<br />${NAME}.s : ${NAME}.c<br />&nbsp;${cc} -S ${NAME}.c -o ${NAME}.s<br />#生成汇编代码的方法<br />other : ${NAME}.o<br />#other选项并未出现在最终目标中，所以直接使用make命令不会执行这一行。要执行这一行，必须使用make other来执行<br />&nbsp;${cc} ${CFLAG} ${NAME}.o -o other<br />#这里并未使用显示规则来指定${NAME}.o的生成方式，因为对于make命令而言，如果在规则中发现name.o文件，其会自动寻找同名的c代码（name.c），然后自动根据找到的代码调用相应的编译器编译生成name.o文件<br />
<hr />
<br />好了,我们的Makefile 也差不多了,如果想知道更多的关于Makefile 规则可以查看相应的文档。<img src ="http://www.cppblog.com/Daywei0123/aggbug/169005.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Daywei0123/" target="_blank">Daywei</a> 2012-03-26 14:56 <a href="http://www.cppblog.com/Daywei0123/archive/2012/03/26/169005.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>linux下C/C++学习2——gcc</title><link>http://www.cppblog.com/Daywei0123/archive/2012/03/21/168478.html</link><dc:creator>Daywei</dc:creator><author>Daywei</author><pubDate>Wed, 21 Mar 2012 05:05:00 GMT</pubDate><guid>http://www.cppblog.com/Daywei0123/archive/2012/03/21/168478.html</guid><wfw:comment>http://www.cppblog.com/Daywei0123/comments/168478.html</wfw:comment><comments>http://www.cppblog.com/Daywei0123/archive/2012/03/21/168478.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Daywei0123/comments/commentRss/168478.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Daywei0123/services/trackbacks/168478.html</trackback:ping><description><![CDATA[<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;前面一篇已经简单的介绍了如何利用gcc编译c源代码，这篇说一下gcc的具体编译过程&nbsp;&nbsp;&nbsp;</p>
<p>
<hr />

<p>&nbsp;</p>
<ol><li>预处理</li></ol>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;预处理的工作主要是处理#include语句等，然后生成*.i文件。如果不加参数&#8220;-o *.i&#8221;,则会将预处理的结果输出到标准输出。</p>
<p>
<hr />

<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;gcc -E *.c -o *.i&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #使用gcc的E参数进行预处理<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cpp *c - o *.i&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #使用cpp命令进行预处理<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;这两条命令预处理的结果一样，因为gcc使用-E参数实际上也是调用了cpp指令。<br /></p>
<p>
<hr />

<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;2.生成汇编代码<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
<hr />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;gcc -S *c -o *.s&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #将C代码汇编为汇编语言代码<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;gcc -S *.i -o *.s&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#将i文件汇编为汇编语言代码<br />
<hr />
&nbsp;&nbsp;&nbsp;3.编译<br /><br />
<hr />

<p>&nbsp;</p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;gcc -c *.c -o *.o<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;gcc -c *.s -o *o<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;as&nbsp; *.s -o *.o<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cc -c *.c -o *.o 
<hr />
&nbsp;&nbsp;&nbsp;4.链接<br />
<hr />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;gcc *.o -o *out 
<hr />

<p><br /><strong>GCC高级技巧<br /></strong>1.指定头文件位置<br />&nbsp;&nbsp;&nbsp;一是在源码中指定头文件的绝对路径，简单直观但缺乏灵活性，二是在编译时使用&#8220;-I&#8221;参数来指定头文件的路径，实际工作中，一般选择第二种。</p>
<p>
<hr />

<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;使用第二种方法将resolv.c编译为resolv.out的命令如下：<br />&nbsp;&nbsp;&nbsp;gcc resolv.c -I /home/myname/code/header -o resolv.out 如果找不到会按照代码所在目录或系统目录寻找头文件<br />&nbsp;&nbsp;&nbsp;gcc resolv.c -I /home/myname/code/header&nbsp; -I /home/myname/code/header2 -o resolv.out&nbsp; 多个路径<br /></p>
<p>
<hr />

<p>&nbsp;</p>
<p>2.定义符号常量<br />&nbsp;&nbsp;&nbsp;在代码中会使用一些常量来控制程序的行为，如#define WIRELESS 211&nbsp; 等等一系列，怎么来检验定义了符号常量与为定义符号常量的区别，一般在编译时使用-D参数来指定符号常量，命令如下:gcc -D WIRELESS&nbsp; -I /home/myname/code/header resolv.c -o resolv.out<br />3.定义警告级别<br />&nbsp;&nbsp;&nbsp;最常用的警告选项是-Wall选项。其意思是warning all。使用如下命令显示特定警告信息来编译test.c，命令如下：<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;gcc -Wall test.c -o test<br />4.其他GCC选项<br />&nbsp;&nbsp;&nbsp;gcc [option] [filename]</p>
<p>
<hr />

<p>&nbsp;</p>
<ul><li>-c：只将源代码编译为以.o为后缀的目标文件，而不是直接将这些文件连接可执行文件。通常用于不包含主程序（man函数）的子程序代码。</li><li>-o：filename: 指定输出文件名。如果不用这个选项，gcc会将文件输出到a.out，而不管输出文件的类型</li><li>-g：产生调试信息。如果要使用gdb进行调式，则必须使用该选项。但是该选项所产生的调式符号，并不能被其他调式器识别。</li><li>-O：在程序编译、连接过程中对代码进行优化。</li><li>-O2：比-O更好的优化编译、连接。</li><li>-L dir：在程序连接时，会首先在dir目录寻找类库文件，然后在系统预设路径中寻找类库。也可以使用多个-L参数指定多个类库存放的目录。</li><li>-lname：在程序连接时加载名为libname.a的函数库。如-lmath 表示连接名为libmath.a的数学函数库。</li><li>--sysboot=dir：让目录dir作为头文件和库文件的根目录</li><li>-B dir：将目录dir添加到编译器的搜索路径中。</li><li>-b：指定gcc编译的目标机器架构，如ARM、DEC、GNU/Linux、IA64、MIPS等，这也可以看出gcc的超级跨平台性。</li><li>-V n1.n2：使用n1.n2指定版本的gcc进行编译</li><li>-E：仅作预处理，不能进行编译等工作，生成i文件</li><li>-S：将源码编译为汇编语言代码</li><li>-x lang：将源代码依照特定语言进行编译，可以取得值包括但不限于C、C++、Objective-C、Objective-C++、Assembler、Ada、java等。在一系列的编译中，该选项会一直保持，知道另一个-x lang出现，指定另一种编译语言。如果是none，意味着让gcc一句文件的后缀来自动判断语言种类。<br /><br /><br /></li></ul><img src ="http://www.cppblog.com/Daywei0123/aggbug/168478.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Daywei0123/" target="_blank">Daywei</a> 2012-03-21 13:05 <a href="http://www.cppblog.com/Daywei0123/archive/2012/03/21/168478.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Linux下C/C++学习1</title><link>http://www.cppblog.com/Daywei0123/archive/2012/03/19/168302.html</link><dc:creator>Daywei</dc:creator><author>Daywei</author><pubDate>Mon, 19 Mar 2012 03:08:00 GMT</pubDate><guid>http://www.cppblog.com/Daywei0123/archive/2012/03/19/168302.html</guid><wfw:comment>http://www.cppblog.com/Daywei0123/comments/168302.html</wfw:comment><comments>http://www.cppblog.com/Daywei0123/archive/2012/03/19/168302.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Daywei0123/comments/commentRss/168302.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Daywei0123/services/trackbacks/168302.html</trackback:ping><description><![CDATA[<p><font style="background-color: #cce8cf" color="#000000" face="Verdana">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在Linux 下面,如果要编译一个C 语言源程序,我们要使用GNU 的gcc 编译器。下面<br />我们以一个实例来说明如何使用gcc 编译器。假设我们有下面一个非常简单的源程序<br />(hello.c)：<br />int main(int argc,char **argv)<br />{<br />printf("Hello Linux\n");<br />}<br />要编译这个程序,我们只要在命令行下执行：<br />gcc -o hello hello.c<br /><br />下面就详细说一下gcc的编译过程<br /><br />gcc由C语言源代码文件生成可执行文件的过程，一般来说分为四个阶段：预处理（也称预编译Preprocessing）、编译（compilation）、汇编（Assembly）和链接（linking）。这四个阶段分别由gcc调用不同的程序来实现。<br />&nbsp; </p>
<p>
<hr />
</p>
<ul><li>预处理是调用cpp程序来实现的，预处理主要是对包含语句、宏定义等进行处理。</li><li>编译是调用cc来实现的，它是源文件变为后缀为.o的目标文件的过程。</li><li>汇编过程是对汇编语言的操作，通过调用as来实现，汇编同样也生成目标文件。</li><li>链接是通过用ld来实现的。这是最为关键的步骤，在该阶段，ld会将各程序的执行代码放置在程序的适合位置，同时，程序调用的库函数也会以适当的方法设置调用接口。</li></ul>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;gcc编译时，如果在命令行没有指定其他参数，则gcc会完成编译、链接的过程，然后在当前目录中生成一个名为a.out的可执行文件。一般来说，linux并不依赖文件的后缀来识别文件是否为可执行程序，其判断文件是否可执行依据的是文件的属性。如果对于当前用户而言，文件有运行权限，则该文件为一个可执行程序。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;对于gcc而言，判断文件的类型主要是依据文件的后缀名。所以，要使用gcc编译代码，正确使用文件后缀是保证编译正确的前提。如果写了一个C++代码，却使用了.c为后缀，gcc在编译该文件时会将该文件按照C语言代码来处理，一般会出错。</p>
<p>
<hr />
<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;一些gcc常用的文件后缀名：<br /></p>
<ul><li>c: C语言源代码文件</li><li>a：由目标文件构成的档案库文件</li><li>.C、.cc 或.cxx：c++源代码文件</li><li>h：头文件</li><li>i：经过预处理的C源代码文件</li><li>ii：经过预处理的C++源代码文件</li><li>m：Objective-C源代码文件</li><li>o：编译后的目标文件</li><li>s:汇编语言源代码文件</li><li>S:经过预编译的汇编语言源代码文件<br /><br />gcc hello.c编译通过后，就可以简单的使用a.out调用该程序，使用命令如下：./a.out</li><li>注意：这里不能直接使用a.out来调用该程序，因为shell在寻找可执行程序时，并不在当前目录中寻找，所以必须用&#8220;./&#8221;来显示指定该文件的路径是当前目录<br /></li></ul></font><img src ="http://www.cppblog.com/Daywei0123/aggbug/168302.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Daywei0123/" target="_blank">Daywei</a> 2012-03-19 11:08 <a href="http://www.cppblog.com/Daywei0123/archive/2012/03/19/168302.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>