??xml version="1.0" encoding="utf-8" standalone="yes"?>精品久久久久中文字,狠狠狠色丁香婷婷综合久久俺,久久超碰97人人做人人爱http://www.shnenglu.com/Daywei0123/category/18866.html技术追求卓?梦想创造未?/description>zh-cnSun, 11 Sep 2016 16:31:46 GMTSun, 11 Sep 2016 16:31:46 GMT60CMake使用http://www.shnenglu.com/Daywei0123/archive/2016/09/11/214272.htmlDayweiDayweiSun, 11 Sep 2016 14:52:00 GMThttp://www.shnenglu.com/Daywei0123/archive/2016/09/11/214272.htmlhttp://www.shnenglu.com/Daywei0123/comments/214272.htmlhttp://www.shnenglu.com/Daywei0123/archive/2016/09/11/214272.html#Feedback0http://www.shnenglu.com/Daywei0123/comments/commentRss/214272.htmlhttp://www.shnenglu.com/Daywei0123/services/trackbacks/214272.htmlcmake学习Q一Q静态库与动态库构徏

(.so)׃n库,shared objectQ节省空_在运行时去连接,如果执行机器上没有这些库文g׃能执行?br />(.a)静态库,archiveQ静态库和程序化Z体,不会分开?br />通过 ldd命o可以查看一个可执行E序所依赖的的׃n库?br />使用环境变量LD_LIBRARY_DIRECTORY可以指定׃n库位|?/p>


一、编译共享库Q?
ADD_LIBRARY(hello SHARED ${SHARED_LIBRARY})

二、添加静态库Q?br />ADD_LIBRARY(hello STATIC ${STATIC_LIBRARY})
因ؓ默认规则是不能有相同名字的共享库与静态库Q所以当生成静态库的时候(so后缀Q,׃n库会被删除,因ؓ只能允许一个名字存在,相同名字的会被替代(helloQ,所以需要通过SET_TARGET_PROPERTIES()来解册个问题,例子Q?br />SET_TARGET_PROPERTIES(hello_static PROPERTIES OUTPUT_NAME "hello")
cmake在构Z个target的时候,会删除之前生成的targetQ一h通过讄SET_TARGET_PROPERTIES(hello PROPERTIES CLEAN_DIRECT_OUTPUT 1)来达到目?br />三、动态库的版本号Q?br />同样是通过SET_TARGET_PROPERTIES()来设|?br />SET_TARGET_PROPERTIES(hello PROPERTIES VERSION 1.2 SOVERSION 1)
VERSIONQ动态库版本
SOVERSIONQAPI版本
最后生成的l果是:
libhello.so.1.2
libhello.so.1->libhello.so.1.2
libhello.so->libhello.so.1
四、安装:
INSTALL(TARGETS hello hello_static
LIBRARY DESTINATION lib
ARCHIVE DESTINATION lib)
INSTALL(TARGETS hello.h
DESTINATION include/hello)
其他常用的属?PERMISSIONSQ设|权限;RATTERNQ设|正则表辑ּ


Summary:
ADD_LIBRARY()Q添加一个库Q共享库Q静态库Q模?br />SET_TARGET_PROPERTIES()Q设|输出名Uͼ版本P解决相同target被删除的问题
GET_TARGET_PROEERTIES()Q与SET功能相对

cmake学习Q二Q常用变量和常用环境变量
一、变量的引用方式是?#8220;${}”Q在IF中,不需要用这U方式,直接使用变量名即?
二、自定义变量使用SET(OBJ_NAME xxxx)Q用时${OBJ_NAME}
三、cmake的常用变量:
CMAKE_BINARY_DIR,PROJECT_BINARY_DIR,_BINARY_DIRQ?br />q三个变量内容一_如果是内部编译,指的是工程的顶U目录,如果是外部编译,指的是工程~译发生的目录?br />CMAKE_SOURCE_DIR,PROJECT_SOURCE_DIR,_SOURCE_DIRQ?br />q三个变量内容一_都指的是工程的顶U目录?br />CMAKE_CURRENT_BINARY_DIRQ外部编译时Q指的是target目录Q内部编译时Q指的是目录
CMAKE_CURRENT_SOURCE_DIRQCMakeList.txt所在的目录
CMAKE_CURRENT_LIST_DIRQCMakeList.txt的完整\?br />CMAKE_CURRENT_LIST_LINEQ当前所在的?br />CMAKE_MODULE_PATHQ如果工E复杂,可能需要编写一些cmake模块Q这里通过SET指定q个变量
LIBRARY_OUTPUT_DIR,BINARY_OUTPUT_DIRQ库和可执行的最l存攄?br />PROJECT_NAMEQ你猜~~

 

四、cmake中调用环境变?br />1.Using $ENV{NAME} : invoke system environment varible.
We can use "SET(ENV{NAME} value)" as well. note that the "ENV" without "$".
2.CMAKE_INCLUDE_CURRENT_DIR equal to INCLUDE_DIRECTORY(${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR})


五、其他的内置变量
1.BUILD_SHARED_LIBS:set the default value when using ADD_LIBRARY()
2.CMAKE_C_FLAGS: set compiler for c language
2.CMAKE_CXX_FLAGS: set compiler for c++ language


六、区分debug和release
在工E目录下Qcmake -DCMAKE__BUILD_TYPE=DEBUG(RELEASE)Q再执行make


七、指定编?2bit?4bitE序
SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -m32")
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -m32")

cmake学习Q三Q常用指?/span>

一、基本指令:
INCLUDE_DIRECTORIES(${includedir}) #-I?br />LINK_DIRECTORIES(${libdir}) #-L
TARGET_LINK_LIBRARIES(helloworld ${linkflags}) #-l
ADD_DEFINITIONS(${cflags}) #-D
 
1、ADD_DEFINATIONSQ向C/CPPd宏定义,相当于gcc中的-DQ参C间用I格分割
2、ADD_DEPENDICIES(target_name, depend_name)Q定义target对其他target的依赖关p?br />3、AUX_SOURCE_DIRECTORY(dir VARIBLE)Q把目录下的所有源文g保存在变量中Q基本用来创建源文g列表
4、ADD_EXECUTABLEQ指定目录,生成执行文g
5、EXEC_PROGRAMQ外部调用指令,可移执行M外部命oQ后面加参数Q例子如下:
EXEC_PROGERAM(ls ARGS"*.c" OUTPUT_VARIBLE LS_OUTPUT RETURN_VALUE LS_RVALUE)
IF(not LS_RVALUE)
MESSAGE(STATUS "xxx")
ENDIF(not LS_RVAULE)
PS.q里执行ls *.c指oQ执行成功的话,q回0?br />6、FILE指oQ?br />FILE(WRITE file_name "content")
FILE(APPEND file_name "content")
FILE(READ file_name varible)
FILE(WRITE file_name "content")
7、FIND_pd指oQ?br />LIBRARY( name path)Q?br />FIND_LIBRARY(Xorg X11 /usr/lib64)
IF(not Xorg)
MESSAGE(STATUS "no Xorg")
ENDIF(not Xorg)
FILE( name path)
PATH( name path)
PROGRAM( name path)
PACKAGE( [major.minor][QUIET][NO MODULE][[REQUIRED][COMPONTS][componts....]])
最后一条,用来调用攑֜CMAKE_MODULE_PATH下的Find.cmake模块Q也可以自定义Find模块
首先通过SET(CMAKE_MODULE_PATH /home/...)来指定位|?/p>

8、控制指令:
IF(expression)QELSE(expression)QENDIF(expression)
express举例Q?br />否定Q空Q?QNQNOQOFFQFALSEQNOTFOUND或_NOTFOUND
肯定QCOMMAND cmdQEXISTS dir/fileQvariable MARCHES regex{等{等q有很多~~~随用随查?/p>


cmake学习Q四Q模块的使用和自定义模块

FIND_PACKAGE
每一个模块都会生如下变?br />_FOUND
_INCLUDE_DIR
_LIBRARY or _LIBRARIES
如果_FOUND为真Q把_INCLUDE_DIR加入到INCLUDE_DIRECTORIES中,_LIBRARY加入到TARGET_LINK_LIBRARIES中?/p>

~写属于自己的FindHello模块Q?br />1.FIND_PATH(HELLO_INCLUDE_DIR hello.h /usr/include/hello /usr/local/include/hello)
2.FIND_LIBRARY(HELLO_LIBRARY_DIR NAMES hello PATH /usr/lib /usr/local/lib)
  IF(HELLO_INCLUDE_DIR AND HELLO_LIBRARY)
  SET(HELLO_FOUND TRUE)
  ENDIF(HELLO_INCLUDE_DIR)
3.FIND_PACKAGE([major.minor][QUIET][NO_MODULE]
[[REQUIRED|COMPONENTS][componets...]])
QUIET参数Q去掉输Z?br />REQUIRED参数Q共享库是否是工E必ȝQ如果是必须的,那么找不?br />如果在src中想调用hello模块中的内容
FIND_PACKAGE(HELLO)
Z可以让工E找到FindHELLO.cmake
在主工程的CMakeList.txt中,SET(CMAKE_MODULE_PATH ${PROJECT_SOURCE_PATH}/cmake)
通过讄FIND_PACKAGE(HELLO QUIET)可以L输出信息

Cmake CMAKE_BUILD_TYPE specification

That’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 “debug” mode, for easily single-stepping through it with a debugger, or in “release” mode, with speed optimization enabled.

To fix this you simply need to specify a build type in the CMakeLists.txt file, in this way:


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()

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.


 



Daywei 2016-09-11 22:52 发表评论
]]>
vim使用ȝinghttp://www.shnenglu.com/Daywei0123/archive/2013/04/06/199143.htmlDayweiDayweiSat, 06 Apr 2013 04:12:00 GMThttp://www.shnenglu.com/Daywei0123/archive/2013/04/06/199143.htmlhttp://www.shnenglu.com/Daywei0123/comments/199143.htmlhttp://www.shnenglu.com/Daywei0123/archive/2013/04/06/199143.html#Feedback0http://www.shnenglu.com/Daywei0123/comments/commentRss/199143.htmlhttp://www.shnenglu.com/Daywei0123/services/trackbacks/199143.htmlVIM官网Q?br />
http://www.vim.org/
里面已经包含了很多插Ӟ可随意配|?/span>
先是一?/span>vim基本配置

vim语法高亮昄和自动羃q?/span>
      
1、配|文件的位置
在目?/etc/ 下面Q有个名?strong>vimrc的文Ӟq是pȝ中公qvim配置文gQ对所有用户都有效。而在每个用户的主目录下,都可以自己徏立私有的配置文gQ命名ؓQ?#8220;.vimrc”。例如,/root目录下,通常已经存在一?strong>.vimrc文g?/div>
    2、设|语法高亮显C?/span>
1) 打开vimrcQ添加以下语句来使得语法高亮昄Q?/div>
syntax on
2) 如果此时语法q是没有高亮昄Q那么在/etc目录下的profile文g中添加以下语句:
export TERM=xterm-color
      
    3、设|?/span>Windows风格?/span>C/C++自动~进Q添加以?/span>set语句?/span>vimrc中)
              1Q设|(软)制表W宽度ؓ4Q?/div>
                            set tabstop=4
                            set softtabstop=4
              2Q设|羃q的I格Cؓ4
                          set shiftwidth=4
              3Q设|自动羃q:x行的~进g上一行相{;使用 noautoindent 取消讄Q?/span>
set autoindent
              4Q?span>讄使用 C/C++ 语言的自动羃q方式:
                          set cindent
              5Q设|C/C++语言的具体羃q方式(以我的windows风格ZQ:
                            set cinoptions={0,1s,t0,n-2,p2s,(03s,=.5s,>1s,=1s,:1s
              6Q如果想在左侧显C文本的行号Q可以用以下语句Q?/div>
                          set nu
              7Q最后,如果没有下列语句Q就加上吧:
if &term=="xterm"
set t_Co=8
             set t_Sb=^[[4%dm
set t_Sf=^[[3%dm
              endif

安装ctags+taglist
1.ctags
Q?Q到http://ctags.sourceforge.net/下蝲ctags源码ctags-5.6.tar.gz
http://prdownloads.sourceforge.net/ctags/ctags-5.6.tar.gz
Q?Q解压ƈ安装
tar zxvf ctags-5.6.tar.gz
cd ctags-5.6
./configure && make && make install
Q?Q?br />[/home/brimmer/src]$ ctags -R

"-R"表示递归创徏Q也包括源代码根目录下的所有子目录下的源程序?tags"文g中包括这些对象的列表Q?br />l ?define定义的宏
l 枚D型变量的?br />l 函数的定义、原型和声明
l 名字I间QnamespaceQ?br />l cd定义QtypedefsQ?br />l 变量Q包括定义和声明Q?br />l c(classQ、结构(structQ、枚丄型(enumQ和联合QunionQ?br />l cR结构和联合中成员变量或函数
VIM用这?tags"文g来定位上面这些做了标记的对象Q下面介l一下定位这些对象的ҎQ?br />
1) 用命令行。在q行vim的时候加?-t"参数Q例如:
[/home/brimmer/src]$ vim -t foo_bar
q个命o打开定义"foo_bar"Q变量或函数或其它)的文Ӟq把光标定位到这一行?br />2) 在vim~辑器内?:ta"命oQ例如:
:ta foo_bar
3) 最方便的方法是把光标移到变量名或函数名上,然后按下"Ctrl-]"。用"Ctrl-o"退回原来的地方?br />注意Q运行vim的时候,必须?tags"文g所在的目录下运行。否则,q行vim的时候还要用":set tags="命o讑֮"tags"文g的\径,q样vim才能扑ֈ"tags"文g?br />
在函CUd光标
[{ 转到上一个位于第一列的"{"
}] 转到下一个位于第一列的"{"
{ 转到上一个空?br />} 转到下一个空?Q[ and ] 也分别是两个指oQ?br />gd 转到当前光标所指的局部变量的定义
* 转到当前光标所指的单词下一ơ出现的地方
# 转到当前光标所指的单词上一ơ出现的地方
Vim 的创造者是一名计机E序员,因此q就不奇?Vim 中有许多帮助~写E序的功能:
跌{到标识符被定义和使用的地方;在另一个窗口中预览有关的声明等{?br />Qctags使用部分参考了 文章“ctags和vim”Q原文在
http://hi.baidu.com/original/blog/item/2cf8d53f00b7fcc27d1e71f0.htmlQ?br />更多使用也请参考原文)


2. taglist
能够列出源文件中的tag(function, class, variable, etc)q蟩?
注意Qtaglist依赖于ctagsQ所以要先装ctagsQ否则taglist装了也没法用Q?br />Q?Q到http://vim.sourceforge.net/scripts/script.php?script_id=273
下蝲taglist_42.zipQ即
http://vim.sourceforge.net/scripts/download_script.php?src_id=6416
Q?Q解压得C个文?br /># unzip -d taglist taglist_42.zip
# cd taglist
# tree
.
|-- doc
| `-- taglist.txt
`-- plugin
`-- taglist.vim
Q?Q安?br />cp doc/taglist.txt /usr/share/vim/vim61/doc/
cp plugin/taglist.vim /usr/share/vim/vim61/plugin/
Q?Q配|和使用
cd /usr/share/vim/vim61/doc/
启动vimQ用 “:helptags .”来配|好帮助文g
重启vimQ用“:TlistToggle”来打开和关闭taglistH口?br />可以?#8220;:help taglist”来获得更多帮助信?/div>
set tags=./tags,./../tags,./http://www.cnblogs.com/tags,./**/tags
                   
let Tlist_Use_Left_Window=1
let Tlist_Auto_Update=1
let Tlist_Exit_OnlyWindow=1
let Tlist_Show_One_File=1
nmap <F7> :TlistToggle <CR>
其次安装配置基本的插?/span>
1.安装好Vim和Vim的基本插件。在ubuntu下这些用apt-get安装卛_Q?/span>
lingd@ubuntu:~/arm$sudo apt-get install vim vim-scripts vim-doc
其中vim-scripts是vim的一些基本插Ӟ包括语法高亮的支持、羃q等{?/span>
vim中文帮助文档tar包下载地址:
http://sourceforge.net/projects/vimcdoc/files/vimcdoc/
解压后其中有个doc文g? 其中的内容全部复制到~/.vim/doc, 或者vim安装目录下的doc目录? 此时vim中的help信息已经是中文的?
|页版中文帮助文档网址http://vimcdoc.sourceforge.net/doc/help.html
首页时vim帮助文档的目录,阅读h更方便有效、更有针Ҏ!

2.理vim插g——vim-addons
通过vim-addonsQ我们可以管理vim插g。我们在sudo apt-get install vim vim-scripts vim-docӞ一般会自动安装上vim-addons。若未安装可通过sudo apt-get install vim-addon-manager手动安装。安装完成后Q就可以用vim-addons理vim插g了?br /> # pȝ中已有的vim-scripts中包含的插g及其状态:
lingd@ubuntu:~$ vim-addons status
# Name                     User Status  System Status
align                       removed       removed      
alternate                   removed       removed      
bufexplorer                 removed       removed      
calendar                    removed       removed      
closetag                    removed       removed      
colors sampler pack         removed       removed      
cvsmenu                     removed       removed      
debPlugin                   removed       removed      
detectindent                removed       removed      
doxygen-toolkit             removed       removed      
editexisting                removed       removed      
enhanced-commentify         removed       removed      
gnupg                       removed       removed      
info                        removed       removed      
justify                     removed       removed      
lbdbq                       removed       removed      
markdown-syntax             removed       removed      
matchit                     removed       removed      
minibufexplorer             installed     removed      
nerd-commenter              removed       removed      
omnicppcomplete             installed     removed      
po                          removed       removed      
project                     installed     removed      
python-indent               removed       removed      
secure-modelines            removed       removed      
snippetsEmu                 removed       removed      
sokoban                     removed       removed      
supertab                    removed       removed      
surround                    removed       removed      
taglist                     installed     removed      
tetris                      removed       removed      
utl                         removed       removed      
vcscommand                  removed       removed      
vimplate                    removed       removed      
whatdomain                  removed       removed      
winmanager                  removed       removed      
xmledit                     removed       removed   




ReferenceQ?/em>
vim配置为C/C++开发环?
一步步vim攚w成C/C++开发环?IDE)
              

Daywei 2013-04-06 12:12 发表评论
]]>Linux下C/C++学习4——程序调?/title><link>http://www.shnenglu.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.shnenglu.com/Daywei0123/archive/2012/04/04/170048.html</guid><wfw:comment>http://www.shnenglu.com/Daywei0123/comments/170048.html</wfw:comment><comments>http://www.shnenglu.com/Daywei0123/archive/2012/04/04/170048.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/Daywei0123/comments/commentRss/170048.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/Daywei0123/services/trackbacks/170048.html</trackback:ping><description><![CDATA[gcc~译的几U错误信息及其解x?br />1.语法错误<br />   一般实在输入代码时括号不匹配或者用了关键字。遇到语法错误,可以仙剑ơ错误提CZ出现的第一个行P如果该行没有问题Q就查该行所开始的语法模块是否完整Q然后修正该l构?br />2.头文仉?br />   如果~译器出的错误提Ccan not find include file ***.hQ就说明是指定的包含文g有问题,pȝ在编译过E中找不到指定的头文?br />3.cd错误<br />   如果出现cM“ld:-lm:No such file or directory”的错误,可能是在默认的目录内找不到相应的cd。这U问题的解决Ҏ是在~译时?I参数指定要用的cd所在的目录?br />4.未定义符?br />   出现cMUndefined symbol 的提C,说明在编译过E中发现了没有被定义的符号变?br /><br />gdb?br />gdb E序?br />gdb <br />q两U方式均可进入gdb的交互式调试界面。在交互模式中可以用许多命令:<br /><ul><li>fileQ加载要调试的程?/li><li>killQ终止正在调试的E序</li><li>listQ列?0行程序的源代?/li><li>nextQ单步执行程?/li><li>stepQ单步执行程序,与next不同的是Q其会进入调用的函数内部。而next只需要调用函数的l果?/li><li>runQ运行加载的E序</li><li>quitQ退出gdb</li><li>watchQ监视一个变量的?/li><li>breakQ在代码里设|断点,E序q行到断点处时会停下来,然后用户可用next或step单步执行E序。但使用break的前提是E序在编译时使用了g参数</li><li>makeQ不用退出gdbQ重新编译代码,然后在gdb中运?/li><li>shellQ可调用shell命o</li><li>btQ查看函数堆?/li><li>c函数Ql运?/li><li>finishQ退出函?/li><li>infoQ查看相关信息,如info break<br /></li></ul><img src ="http://www.shnenglu.com/Daywei0123/aggbug/170048.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/Daywei0123/" target="_blank">Daywei</a> 2012-04-04 14:26 <a href="http://www.shnenglu.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——Makefilehttp://www.shnenglu.com/Daywei0123/archive/2012/03/26/169005.htmlDayweiDayweiMon, 26 Mar 2012 06:56:00 GMThttp://www.shnenglu.com/Daywei0123/archive/2012/03/26/169005.htmlhttp://www.shnenglu.com/Daywei0123/comments/169005.htmlhttp://www.shnenglu.com/Daywei0123/archive/2012/03/26/169005.html#Feedback0http://www.shnenglu.com/Daywei0123/comments/commentRss/169005.htmlhttp://www.shnenglu.com/Daywei0123/services/trackbacks/169005.html/* main.c */
#include 
"mytool1.h"
#include 
"mytool2.h"
int main(int argc,char **argv)
{
    mytool1_print(
"hello");
    mytool2_print(
"hello");
}

/* mytool1.h */
#ifndef _MYTOOL_1_H
#define _MYTOOL_1_H
void mytool1_print(char *print_str);
#endif
/* mytool1.c */
#include 
"mytool1.h"
void mytool1_print(char *print_str)
{
    printf(
"This is mytool1 print %s\n",print_str);
}

/* mytool2.h */
#ifndef _MYTOOL_2_H
#define _MYTOOL_2_H
void mytool2_print(char *print_str);
#endif
/* mytool2.c */
#include 
"mytool2.h"
void mytool2_print(char *print_str)
{
    printf(
"This is mytool2 print %s\n",print_str);
}



当然׃q个E序是很短的我们可以q样来编?br />gcc -c main.c
gcc -c mytool1.c
gcc -c mytool2.c
gcc -o main main.o mytool1.o mytool2.o
q样的话我们也可以生main E序,而且也不时很ȝ.但是如果我们考虑一下如果有一天我们修改了其中的一个文?比如说mytool1.c)那么我们Nq要重新输入上面的命?也许你会?q个很容易解军_Q我写一个SHELL 脚本,让她帮我d成不可以了.是的对于q个E序来说,是可以vC用的Q但是当我们把事情想的更复杂一?如果我们的程序有几百个源E序的时?N也要~译器重C个一个的ȝ?
为此,聪明的程序员们想Z一个很好的工具来做qg事情,q就是make.我们只要执行以下make,可以把上面的问题解x.在我们执行make 之前,我们要先~写一个非帔R要的文g.--Makefile.对于上面的那个程序来?可能的一个Makefile 的文件是Q?br /># q是上面那个E序的Makefile 文g
mainQmain.o mytool1.o mytool2.o
gcc -o main main.o mytool1.o mytool2.o
main.oQmain.c mytool1.h mytool2.h
gcc -c main.c
mytool1.oQmytool1.c mytool1.h
gcc -c mytool1.c
mytool2.oQmytool2.c mytool2.h
gcc -c mytool2.c
有了q个Makefile 文g,不过我们什么时候修改了源程序当中的什么文?我们只要执行make 命oQ我们的~译器都只会ȝ译和我们修改的文件有关的文g,其它的文件她q理
都不惛_理的?br />下面我们学习Makefile 是如何编写的?br />在Makefile 中也#开始的行都是注释行.Makefile 中最重要的是描述文g的依赖关pȝ说明.一般的格式是:
targetQ?components
TAB rule
W一行表C的是依赖关p?W二行是规则.
比如说我们上面的那个Makefile 文g的第二行
mainQmain.o mytool1.o mytool2.o
表示我们的目?target)main 的依赖对?components)是main.o mytool1.o mytool2.o
当倚赖的对象在目标修改后修改的?pL行规则一行所指定的命?p我们的上面那个Makefile W三行所说的一栯执行 gcc -o main main.o mytool1.o mytool2.o
注意规则一行中的TAB 表示那里是一个TAB ?/strong>
Makefile 有三个非常有用的变量.分别?a href="mailto:$@,$^,$">$@,$^,$<代表的意义分别是Q?br />$@--目标文g,$^--所有的依赖文g,$<--W一个依赖文?
如果我们使用上面三个变量,那么我们可以化我们的Makefile 文g为:
# q是化后的Makefile
mainQmain.o mytool1.o mytool2.o
gcc -o $@ $^
main.oQmain.c mytool1.h mytool2.h
gcc -c $<
mytool1.oQmytool1.c mytool1.h
gcc -c $<
mytool2.oQmytool2.c mytool2.h
gcc -c $<
l过化后我们的Makefile 是简单了一?不过Z有时候还想简单一?q里我们学习一个Makefile 的缺省规?br />..c.oQ?br />gcc -c $<
q个规则表示所有的 .o 文g都是依赖与相应的.c 文g?例如mytool.o 依赖于mytool.c
q样Makefile q可以变为:
# q是再一ơ简化后的Makefile
mainQmain.o mytool1.o mytool2.o
gcc -o $@ $^
..c.oQ?br />gcc -c $<

Makefile的处理规?br />   make命o在处理makefile时是递归处理的。同Ӟmake在处理makefile时会目标文件与依赖文g的时间戳。这个特性降低了~译文g时的旉开销Q因为其只增量编译更新过的文件。还有一点要注意的是Qmakefile文g必须以makefile或Makefile为名?br />对简单Makefile文g的扩?br />   Makefile文g像是一U小型的脚本语言Q所以其也支持变量的定义Q而灵zM用变量,可以增强Makefile的适应性与灉|性。下面是一个用变量的Makefile?br />
##########################################
NAME = myfirst
cc = gcc
ac = as
CFLAG = -Wall -o1 -g
#q是~译源程序的~译选项Q具体含义可参见前面gcc参数介绍
${NAME} asfile : ${NAME}.o asfile.o
#使用变量Ӟ应该使用$提取W,然后用大括号变量名括v?br /> ${cc} ${CFLAG} ${NAME}.o -o ${NAME}
 ${cc} ${CFLAG} asfile.o -o asfile
${NAME}.o : ${NAME}.c
 ${cc} -c ${NAME}.c -o ${NAME}.o
asfile.o : ${NAME}.s
 ${ac} ${NAME}.s -o asfile.o
#由汇~代码生成目标文?br />${NAME}.s : ${NAME}.c
 ${cc} -S ${NAME}.c -o ${NAME}.s
#生成汇编代码的方?br />other : ${NAME}.o
#other选项q未出现在最l目标中Q所以直接用make命o不会执行q一行。要执行q一行,必须使用make other来执?br /> ${cc} ${CFLAG} ${NAME}.o -o other
#q里q未使用昄规则来指?{NAME}.o的生成方式,因ؓ对于make命o而言Q如果在规则中发现name.o文gQ其会自动寻扑֐名的c代码Qname.cQ,然后自动Ҏ扑ֈ的代码调用相应的~译器编译生成name.o文g


好了,我们的Makefile 也差不多?如果想知道更多的关于Makefile 规则可以查看相应的文档?img src ="http://www.shnenglu.com/Daywei0123/aggbug/169005.html" width = "1" height = "1" />

Daywei 2012-03-26 14:56 发表评论
]]>linux下C/C++学习2——gcchttp://www.shnenglu.com/Daywei0123/archive/2012/03/21/168478.htmlDayweiDayweiWed, 21 Mar 2012 05:05:00 GMThttp://www.shnenglu.com/Daywei0123/archive/2012/03/21/168478.htmlhttp://www.shnenglu.com/Daywei0123/comments/168478.htmlhttp://www.shnenglu.com/Daywei0123/archive/2012/03/21/168478.html#Feedback0http://www.shnenglu.com/Daywei0123/comments/commentRss/168478.htmlhttp://www.shnenglu.com/Daywei0123/services/trackbacks/168478.html      前面一已l简单的介绍了如何利用gcc~译c源代码,q篇说一下gcc的具体编译过E?nbsp;  


 

  1. 预处?/li>

      预处理的工作主要是处?include语句{,然后生成*.i文g。如果不加参?#8220;-o *.i”,则会预处理的结果输出到标准输出?/p>


 

      gcc -E *.c -o *.i                     #使用gcc的E参数q行预处?br />      cpp *c - o *.i                          #使用cpp命oq行预处?br />      q两条命令预处理的结果一P因ؓgcc使用-E参数实际上也是调用了cpp指o?br />


 

   2.生成汇编代码
      


      gcc -S *c -o *.s            #C代码汇编为汇~语a代码
      gcc -S *.i -o *.s            #i文g汇编为汇~语a代码

   3.~译


 

      gcc -c *.c -o *.o
      gcc -c *.s -o *o
      as  *.s -o *.o
      cc -c *.c -o *.o
   4.链接

      gcc *.o -o *out


GCC高技?br />1.指定头文件位|?br />   一是在源码中指定头文g的绝对\径,单直观但~Z灉|性,二是在编译时使用“-I”参数来指定头文g的\径,实际工作中,一般选择W二U?/p>


 

   使用W二U方法将resolv.c~译为resolv.out的命令如下:
   gcc resolv.c -I /home/myname/code/header -o resolv.out 如果找不C按照代码所在目录或pȝ目录L头文?br />   gcc resolv.c -I /home/myname/code/header  -I /home/myname/code/header2 -o resolv.out  多个路径


 

2.定义W号帔R
   在代码中会用一些常量来控制E序的行为,?define WIRELESS 211  {等一pdQ怎么来检验定义了W号帔R与ؓ定义W号帔R的区别,一般在~译时?D参数来指定符号常量,命o如下:gcc -D WIRELESS  -I /home/myname/code/header resolv.c -o resolv.out
3.定义警告U别
   最常用的警告选项?Wall选项。其意思是warning all。用如下命令显C特定警告信息来~译test.cQ命令如下:
      gcc -Wall test.c -o test
4.其他GCC选项
   gcc [option] [filename]


 

  • -cQ只源代码~译Z.o为后~的目标文Ӟ而不是直接将q些文gq接可执行文件。通常用于不包含主E序Qman函数Q的子程序代码?/li>
  • -oQfilename: 指定输出文g名。如果不用这个选项Qgcc会将文g输出到a.outQ而不输出文件的cd
  • -gQ生调试信息。如果要使用gdbq行调式Q则必须使用该选项。但是该选项所产生的调式符Pq不能被其他调式器识别?/li>
  • -OQ在E序~译、连接过E中对代码进行优化?/li>
  • -O2Q比-O更好的优化编译、连接?/li>
  • -L dirQ在E序q接Ӟ会首先在dir目录Lcd文gQ然后在pȝ预设路径中寻扄库。也可以使用多个-L参数指定多个cd存放的目录?/li>
  • -lnameQ在E序q接时加载名为libname.a的函数库。如-lmath 表示q接名ؓlibmath.a的数学函数库?/li>
  • --sysboot=dirQ让目录dir作ؓ头文件和库文件的根目?/li>
  • -B dirQ将目录dird到编译器的搜索\径中?/li>
  • -bQ指定gcc~译的目标机器架构,如ARM、DEC、GNU/Linux、IA64、MIPS{,q也可以看出gcc的超U跨q_性?/li>
  • -V n1.n2Q用n1.n2指定版本的gccq行~译
  • -EQ仅作预处理Q不能进行编译等工作Q生成i文g
  • -SQ将源码~译为汇~语a代码
  • -x langQ将源代码依照特定语aq行~译Q可以取得值包括但不限于C、C++、Objective-C、Objective-C++、Assembler、Ada、java{。在一pd的编译中Q该选项会一直保持,知道另一?x lang出现Q指定另一U编译语a。如果是noneQ意味着让gcc一句文件的后缀来自动判断语aU类?br />



Daywei 2012-03-21 13:05 发表评论
]]>
Linux下C/C++学习1http://www.shnenglu.com/Daywei0123/archive/2012/03/19/168302.htmlDayweiDayweiMon, 19 Mar 2012 03:08:00 GMThttp://www.shnenglu.com/Daywei0123/archive/2012/03/19/168302.htmlhttp://www.shnenglu.com/Daywei0123/comments/168302.htmlhttp://www.shnenglu.com/Daywei0123/archive/2012/03/19/168302.html#Feedback0http://www.shnenglu.com/Daywei0123/comments/commentRss/168302.htmlhttp://www.shnenglu.com/Daywei0123/services/trackbacks/168302.html      在Linux 下面,如果要编译一个C 语言源程?我们要用GNU 的gcc ~译器。下?br />我们以一个实例来说明如何使用gcc ~译器。假设我们有下面一个非常简单的源程?br />(hello.c)Q?br />int main(int argc,char **argv)
{
printf("Hello Linux\n");
}
要编译这个程?我们只要在命令行下执行:
gcc -o hello hello.c

下面pl说一下gcc的编译过E?br />
gcc由C语言源代码文件生成可执行文g的过E,一般来说分为四个阶D:预处理(也称预编译PreprocessingQ、编译(compilationQ、汇~(AssemblyQ和链接QlinkingQ。这四个阶段分别由gcc调用不同的程序来实现?br /> 


  • 预处理是调用cppE序来实现的Q预处理主要是对包含语句、宏定义{进行处理?/li>
  • ~译是调用cc来实现的Q它是源文g变ؓ后缀?o的目标文件的q程?/li>
  • 汇编q程是对汇编语言的操作,通过调用as来实玎ͼ汇编同样也生成目标文件?/li>
  • 链接是通过用ld来实现的。这是最为关键的步骤Q在该阶D,ld会将各程序的执行代码攄在程序的适合位置Q同ӞE序调用的库函数也会以适当的方法设|调用接口?/li>

      gcc~译Ӟ如果在命令行没有指定其他参数Q则gcc会完成编译、链接的q程Q然后在当前目录中生成一个名为a.out的可执行文g。一般来_linuxq不依赖文g的后~来识别文件是否ؓ可执行程序,其判断文件是否可执行依据的是文g的属性。如果对于当前用戯言Q文件有q行权限Q则该文件ؓ一个可执行E序?br />      对于gcc而言Q判断文件的cd主要是依据文件的后缀名。所以,要用gcc~译代码Q正用文件后~是保证编译正的前提。如果写了一个C++代码Q却使用?c为后~Qgcc在编译该文g时会该文g按照C语言代码来处理,一般会出错?/p>




      一些gcc常用的文件后~名:

  • c: C语言源代码文?/li>
  • aQ由目标文g构成的档案库文g
  • .C?cc ?cxxQc++源代码文?/li>
  • hQ头文g
  • iQ经q预处理的C源代码文?/li>
  • iiQ经q预处理的C++源代码文?/li>
  • mQObjective-C源代码文?/li>
  • oQ编译后的目标文?/li>
  • s:汇编语言源代码文?/li>
  • S:l过预编译的汇编语言源代码文?br />
    gcc hello.c~译通过后,可以简单的使用a.out调用该程序,使用命o如下Q?/a.out
  • 注意Q这里不能直接用a.out来调用该E序Q因为shell在寻扑֏执行E序Ӟq不在当前目录中LQ所以必ȝ“./”来显C指定该文g的\径是当前目录


Daywei 2012-03-19 11:08 发表评论
]]>
һþaþþƷ| VVþþ| 91Ʒ91þۺ| պŷۺϾþ| þԭƷ| þѾƷƵ| Ʒ99þѹۿ| þþþŮAAƬ | þþƷAV㽶| þù׽| Ļþ| ˾þô߽AVһ| þþƷһĻ| ˾þƵ| 99þþƷһѿ | Ѹþ| 91ɫۺϾþ| þþƷһպ| þùɫAVѹۿ| þþƷݲݲ| 99þwww˳ɾƷ| þþƷ޾Ʒ| þþþþѹۿ| ٸۺϾþĻ| ɫۺϾþ| þҹɫƷAV| þþþþþž99Ʒ| þ㽶һëƬ| þþƷһ| Ʒþþһ| þþѾƷre6| ۺϾƷ㽶þ97 | ޹պۺϾþþƷ| þþƷ| þþþƷһ| .Ʒþþ鶹Ʒ | þ޹Ʒ123| þþwww˳ɾƷ| þù޾Ʒ鶹| þþþþҹƷ| ˹ھƷþþþӰԺ|