??xml version="1.0" encoding="utf-8" standalone="yes"?> -x none filename /* 注释中的不常?*************************************************** -fno-asm *注释完成*********************************************/ -include file
gcc g++ 常用~译选项
讑֮文g所使用的语a,使后~名无?对以后的多个有效.也就是根据约定,C语言的后~名称?c的,而C++的后~名是.C或?cpp,如果你很?
性,军_你的C代码文g的后~名是.pig
哈哈Q那你就要用q个参数,q个参数对他后面的文件名都v作用Q除非到了下一个参数的使用。可以用的参数有下面的q些Q?
`c', `objective-c', `c-header', `c++', `cpp-output', `assembler', and `a
ssembler-with-cpp'.
看到英文Q应该可以理解的?br>
例子用法: cd..
gcc -x c hello.pig
x上一?a name="baidusnap4">
此选项实现ansi选项的功能的一部分Q它止asm,inline和typeof用作关键字?
-fno-strict-prototype
只对gQ+起作?使用q个选项,g++对不带参数的函?都认为是没有昑ּ的对参数的个数和cd说明,而不是没有参?
而gcc无论是否使用q个参数,都将Ҏ(gu)有带参数的函?认ؓ(f)没有昑ּ说明的类?
-fthis-is-varialble
是向传lc++看齐,可以使用this当一般变量?
-fcond-mismatch
允许条g表达式的W二和第三参数类型不匚w,表达式的值将为voidcd
-funsigned-char
-fno-signed-char
-fsigned-char
-fno-unsigned-char
q四个参数是对charcdq行讄,军_charcd讄成unsigned char(前两个参
?或?signed char(后两个参?
包含某个代码,单来?是便于某个文g需要另一个文件的时?可以用它设
?功能q当于在代码中使用Qi nclude<filename>
例子用法:
gcc hello.c -include /root/pianopan.h
-imacros file
file文g的宏,扩展到gcc/g++的输入文?宏定义本wƈ不出现在输入文g?
-Dmacro
相当于C语言中的#define macro
-Dmacro=defn
相当于C语言中的#define macro=defn
-Umacro
相当于C语言中的#undef macro
-undef
取消对Q何非标准宏的定义
-Idir
在你是用Qi nclude"file"的时?gcc/g++?x)先在当前目录查找你所制定的头文g,?
果没有找?他回到缺省的头文件目录找,如果使用-I制定了目??
回先在你所制定的目录查?然后再按常规的顺序去?
对于Qi nclude<file>,gcc/g++?x)?I制定的目录查?查找不到,然后到pȝ的缺
省的头文件目录查?
-I-
是取消前一个参数的功能,所以一般在-Idir之后使用
-idirafter dir
?I的目录里面查扑֤?讲到q个目录里面查找.
-iprefix prefix
-iwithprefix dir
一般一起??I的目录查扑֤??x)到prefix+dir下查?
-nostdinc
使编译器不再pȝ~省的头文g目录里面扑֤文g,一般和-I联合使用,明确限定?
文g的位|?
-nostdin C++
规定不在g++指定的标准\l中搜烦,但仍在其他\径中搜烦,.?strong style="background-color: #ff66ff;">选项在创libg++?
使用
-C
在预处理的时?不删除注释信?一般和-E使用,有时候分析程序,用这个很方便?
-M
生成文g兌的信息。包含目标文件所依赖的所有源代码你可以用gcc -M hello.c
来测试一下,很简单?
-MM
和上面的那个一P但是它将忽略由#i nclude<file>造成的依赖关pR?
-MD
?M相同Q但是输出将导入?d的文仉?
-MMD
?MM相同Q但是输出将导入?d的文仉?
-Wa,option
?strong style="background-color: #ff66ff;">选项传递optionl汇~程?如果option中间有逗号,将option分成多个选项,?
后传递给?x)汇~程?
-Wl.option
?strong style="background-color: #ff66ff;">选项传递optionl连接程?如果option中间有逗号,将option分成多个选项,?
后传递给?x)连接程?
-llibrary
制定~译的时候用的?
例子用法
gcc -lcurses hello.c
使用ncurses库编译程?
-Ldir
制定~译的时候,搜烦库的路径。比如你自己的库Q可以用它制定目录,不然
~译器将只在标准库的目录找。这个dir是目录的名U?
-O0
-O1
-O2
-O3
~译器的优化选项?个别,-O0表示没有优化,-O1为缺省|-O3优化U别最高
-g
只是~译器,在编译的时候,产生调试信息?
-gstabs
?strong style="background-color: #ff66ff;">选项以stabs格式声称调试信息,但是不包括gdb调试信息.
-gstabs+
?strong style="background-color: #ff66ff;">选项以stabs格式声称调试信息,q且包含仅供gdb使用的额外调试信?
-ggdb
?strong style="background-color: #ff66ff;">选项尽可能的生成gdb的可以用的调试信息.
-static
?strong style="background-color: #ff66ff;">选项禁止用动态库Q所以,~译出来的东西,一般都很大Q也不需要什?
动态连接库Q就可以q行.
-share
?strong style="background-color: #ff66ff;">选项尽量用动态库Q所以生成文件比较小Q但是需要系l由动态库.
-traditional
试图让编译器支持传统的C语言Ҏ(gu)?/font>
]]>
1、下载,解压~ACE包,讄环境变量PATH包含$ACE_ROOT$/bin
2、设|?ACE_ROOT$/ace/config.hQ加入一行:(x)Q该语句是ACE针对WIN32q_的配|文Ӟ
#include "ace/config-win32.h"
注意Q?
A、如果你使用9x/MeQ加入:(x)
#define ACE_HAS_WINNT4 0
B、如果你要用标准C++头文件的?
#define ACE_HAS_STANDARD_CPP_LIBRARY 1
C、要使用MFC的话
#define ACE_HAS_MFC 1
以上的define语句都要?include "ace/config-win32.h"之前包含
3、VC6打开$ACE_ROOT$/ace/ace.dswQVC.net打开$ACE_ROOT$/ace/ace/ace.slnQ构建ACE
4、构建成功与否,可打开$ACE_ROOT$/tests下的工程文g看看能不能编译通过
其实Q如果你初学ACE的话Q暂时还不想涉及(qing)上面烦琐的步骤的话,可以找一?exe安装包,安装完成之后Q打开ace.dsw/ace.sln卛_构徏
了;偶开始学ACE的时候,是使用《ACEE序员指? |络与系l编E的实用设计模式》书后自带光盘中ACE53b.exe安装、构建的?
**************在你的程序中使用ACEҎ(gu)Q打开目-->讄Q?
C/C++选项?
Code GenerationQ选择多线E版的运行时库(如:(x)Debug Multithreaded DLLQ?
ProprocessorQ在“附加包含路径”中包?ACE_ROOT$
Link选项?
InputQ在“对象/库模?#8221;包含适当的ACE库文件名Q附表AQ?
加上.libQ如Qaced.lib,acesd.lib{?
InputQ在“附加库\?#8221;中包?ACE_ROOT$/ace
**************附表AQ?
-----------------------------------------------------------
配置 文g?
-----------------------------------------------------------
DLL debug aced
DLL release ace
Static library debug acesd
Static library release aces
MFC DLL debug acemfcd
MFC DLL release acemfc
-----------------------------------------------------------
英文比较好的Q可直接查看$ACE_ROOT$/ACE-INSTALL.html#msvc
ACE环境构徏W记(Linux) :)
**************构徏ACE**************
1Q下载ACE源码包。我下的?.4版的Q文件名为ACE54SRC.tar.gz。gzip解压Qtar解包后,得到一个叫ACE_wrappers
的目录,我把它放?home/lok/ace目录下。注意如果我没有特别说明Q所有操作都是在一般用户下q行的?
2Q编译前的必要工作?
讄环境变量Q在shell下输入:(x)ACE_ROOT=/home/lok/ace/ACE_wrappers; export ACE_ROOT
(注意上面的操作是在同一行中执行的,如果要分行,可以不用分号)。这栯|的变量只是临时的,如果惌怹保存q个变量Q可以切换到rootQ把变量写到文g/etc/profile中;
?ACE_ROOT/ace目录下新Z个config.h文gQ内容ؓ(f)Q?include "ace/config-linux.h"
?ACE_ROOT/include/makeinclude目录下新Z个platform_macros.GNU文gQ内容ؓ(f)Qinclude
$(ACE_ROOT)/include/makeinclude/platform_linux.GNU
3Q在$ACE_ROOT目录下,新徏一个目录,用以执行configure的结?br> mkdir aaa
cd aaa
?ACE_ROOT/aaa中运?br> ../configure
在确认结果无误后Q执?
make
4Q切换到root用户Q把刚生成的libACE.so和libACE.so.5.4.0(?ACE_ROOT/ace目录?拯?usr/libQACE开发环境构建完毕!
**************写个程序测试ACE**************
1Q编写Log_Msg.cppQ内容如下:(x)
#include "ace/Log_Msg.h"
void foo (void);
int ACE_TMAIN (int, ACE_TCHAR *[])
{
ACE_TRACE(ACE_TEXT ("main"));
ACE_DEBUG ((LM_INFO, ACE_TEXT ("%IHi Mom\n")));
foo();
ACE_DEBUG ((LM_INFO, ACE_TEXT ("%IGoodnight\n")));
return 0;
}
void foo (void)
{
ACE_TRACE (ACE_TEXT ("foo"));
ACE_DEBUG ((LM_INFO, ACE_TEXT ("%IHowdy Pardner\n")));
}
2Q写makefileQ内容如下:(x)
LIB = -lACE
LIBPATH = -L$(ACE_ROOT)/ace
HPATH = -I$(ACE_ROOT)
Log_Msg : Log_Msg.cpp
g++ Log_Msg.cpp -o Log_Msg $(LIB) $(LIBPATH) $(HPATH)
3QmakeQ运行Log_MsgQ测试完毕!
***************补充*************
$(ACE_ROOT)/example下有很多例子可以参考,但你?x)发现它们的makefile写得很奇怪,q是因ؓ(f)q些makefile是由E序自动
生成的,目的是让它们可以在不同系l下都可正常工作。关于这些makefileQ可以到http://www.kehui.net
/index.php?op=article&file=read&aid=30812ȝ一下。如果你的程序只需要在linux下工
作,那只要自己写?lACE可以了?nbsp;
]]>
当一个程序崩溃时Q在q程当前工作目录的core文g中复制了该进E的存储囑փ?font face="Times New Roman">core文g仅仅是一个内存映?font face="Times New Roman">(同时加上调试信息)Q主要是用来调试的?/font>
当程序接收到以下UNIX信号?x)生core文gQ?/font>
名字 |
说明 |
ANSI C POSIX.1 |
SVR4 4.3+BSD |
~省动作 |
SIGABRT |
异常l止(abort) |
. . |
. . |
l止w/core |
SIGBUS |
g故障 |
. |
. . |
l止w/core |
SIGEMT |
g故障 |
|
. . |
l止w/core |
SIGFPE |
术异常 |
. . |
. . |
l止w/core |
SIGILL |
非法g指o(h) |
. . |
. . |
l止w/core |
SIGIOT |
g故障 |
|
. . |
l止w/core |
SIGQUIT |
l端退出符 |
. |
. . |
l止w/core |
SIGSEGV |
无效存储讉K |
. . |
. . |
l止w/core |
SIGSYS |
无效pȝ调用 |
|
. . |
l止w/core |
SIGTRAP |
g故障 |
|
. . |
l止w/core |
SIGXCPU |
过CPU限制(setrlimit) |
|
. . |
l止w/core |
SIGXFSZ |
过文g长度限制(setrlimit) |
|
. . |
l止w/core |
在系l默认动作列Q?#8220;l止w/core”表示在进E当前工作目录的core文g中复制了该进E的存储囑փQ该文g名ؓ(f)coreQ由此可以看U功能很久之前就是UNIX功能的一部分Q。大多数UNIX调试E序都用core文g以检查进E在l止时的状态?/font>
core文g的生不是POSIX.1所属部?而是很多UNIX版本的实现特征。UNIXW?版没有检查条? (a)?b)Qƈ且其源代码中包含如下说明Q?#8220;如果你正在找M护信P那么当设|?用户-ID命o(h)执行Ӟ可能生大量的q种信号”?.3 + BSD产生名ؓ(f)core.prog的文Ӟ其中prog是被执行的程序名的前1 6个字W。它对core文gl予了某U标识,所以是一U改q特征?/font>
表中“g故障”对应于实现定义的g故障。这些名字中有很多取自UNIX早先在DP-11上的实现。请查看你所使用的系l的手册Q以切地确定这些信号对应于哪些错误cd?/font>
下面比较详细地说明这些信受?/font>
• SIGABRT 调用abort函数时生此信号。进E异常终止?/font>
• SIGBUS 指示一个实现定义的g故障?/font>
• SIGEMT 指示一个实现定义的g故障?/font>
EMTq一名字来自PDP-11的emulator trap 指o(h)?/font>
• SIGFPE 此信可CZ个算术运异常,例如除以0QQҎ(gu)出等?/font>
• SIGILL 此信hCE已执行一条非法硬件指令?/font>
4.3BSD由abort函数产生此信受SIGABRT现在被用于此?/font>
• SIGIOT q指CZ个实现定义的g故障?/font>
IOTq个名字来自于PDP-11对于输入Q输出TRAP(input/output TRAP)指o(h)的羃写。系lV的早期版本,由abort函数产生此信受SIGABRT现在被用于此?/font>
• SIGQUIT 当用户在l端上按退出键Q一般采用Ctrl-\Q时Q生此信号Qƈ送至前台q?/font>
E组中的所有进E。此信号不仅l止前台q程l(如SIGINT所做的那样Q,同时产生一个core文g?/font>
• SIGSEGV 指示q程q行了一ơ无效的存储讉K?/font>
名字SEGV表示“D违例(segmentation violationQ?#8221;?/font>
• SIGSYS 指示一个无效的pȝ调用。由于某U未知原因,q程执行了一条系l调用指令,
但其指示pȝ调用cd的参数却是无效的?/font>
• SIGTRAP 指示一个实现定义的g故障?/font>
此信号名来自于PDP-11的TRAP指o(h)?/font>
• SIGXCPU SVR4?.3+BSD支持资源限制的概c(din)如果进E超q了其YC P U旉限制Q则产生此信受?/font>
• SIGXFSZ 如果q程过了其软文仉度限Ӟ则SVR4?.3+BSD产生此信受?/font>
摘自《UNIX环境高~程》第10?信号?/font>
使用core文g调试E序
看下面的例子Q?/font>
/*core_dump_test.c*/
#include <stdio.h>
const char *str = "test";
void core_test(){
str[1] = 'T';
}
int main(){
core_test();
return 0;
}
~译Q?br>gcc –g core_dump_test.c -o core_dump_test
如果需要调试程序的话,使用gcc~译时加?font face="Times New Roman">-g选项Q这栯?font face="Times New Roman">core文g的时候比较容易找到错误的地方?/font>
执行Q?br> ./core_dump_test
D错?/font>
q行core_dump_testE序出现?#8220;D错?#8221;Q但没有产生core文g。这是因为系l默?font face="Times New Roman">core文g的大ؓ(f)0Q所以没有创建。可以用ulimit命o(h)查看和修?font face="Times New Roman">core文g的大?br>ulimit -c 0
ulimit -c 1000
ulimit -c 1000
-c 指定修改core文g的大,1000指定?font face="Times New Roman">core文g大小。也可以?font face="Times New Roman">core文g的大不做限Ӟ如:(x)
ulimit -c unlimited
ulimit -c unlimited
如果惌修改怹生效Q则需要修攚w|文Ӟ?font face="Times New Roman"> .bash_profile?font face="Times New Roman">/etc/profile?font face="Times New Roman">/etc/security/limits.conf?/font>
再次执行Q?br>./core_dump_test
D错?/font> (core dumped)
ls core.*
core.6133
可以看到已经创徏了一?font face="Times New Roman">core.6133的文?font face="Times New Roman">.6133?font face="Times New Roman">core_dump_testE序q行的进E?font face="Times New Roman">ID?/font>
调式core文g
core文g是个二进制文Ӟ需要用相应的工h分析E序崩溃时的内存映像?/font>
file core.6133
core.6133: ELF 32-bit LSB core file Intel 80386, version 1 (SYSV), SVR4-style, from 'core_dump_test'
?font face="Times New Roman">Linux下可以用GDB来调?font face="Times New Roman">core文g?/font>
gdb core_dump_test core.6133
GNU gdb Red Hat Linux (5.3post-0.20021129.18rh)
Copyright 2003 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB. Type "show warranty" for details.
This GDB was configured as "i386-redhat-linux-gnu"...
Core was generated by `./core_dump_test'.
Program terminated with signal 11, Segmentation fault.
Reading symbols from /lib/tls/libc.so.6...done.
Loaded symbols for /lib/tls/libc.so.6
Reading symbols from /lib/ld-linux.so.2...done.
Loaded symbols for /lib/ld-linux.so.2
#0 0x080482fd in core_test () at core_dump_test.c:7
7 str[1] = 'T';
(gdb) where
#0 0x080482fd in core_test () at core_dump_test.c:7
#1 0x08048317 in main () at core_dump_test.c:12
#2 0x42015574 in __libc_start_main () from /lib/tls/libc.so.6
GDB中键?font face="Times New Roman">whereQ就?x)看到程序崩溃时堆栈信息Q当前函C前的所有已调用函数的列表(包括当前函数Q,gdb只显C最q几个)Q我们很Ҏ(gu)扑ֈ我们的程序在最后崩溃的时候调用了core_dump_test.c W?font face="Times New Roman">7行的代码Q导致程序崩溃。注意:(x)在编译程序的时候要加入选项-g。?zhn)也可以试试其他命令, 如 fram?font face="Times New Roman">list{。更详细的用法,h?font face="Times New Roman">GDB文档?/font>
core文g创徏在什么位|?/strong>
在进E当前工作目录的下创建。通常与程序在相同的\径下。但如果E序中调用了chdir函数Q则有可能改变了当前? 作目录。这时core文g创徏在chdir指定的\径下。有好多E序崩溃了,我们却找不到core文g攑֜什么位|。和chdir函数有关系。当然程? 崩溃了不一定都产生core文g?/font>
在下列条件下不生core文gQ?br>( a )q程是设|?用户-IDQ而且当前用户qE序文g的所有者;
( b )q程是设|?l?IDQ而且当前用户q该程序文件的l所有者;
( c )用户没有写当前工作目录的许可权;
( d )文g太大。core文g的许可权(假定该文件在此之前ƈ不存?通常是用戯/写,l读和其他读?/font>
利用GDB调试core文gQ当遇到E序崩溃时我们不再束手无{?/font>
当程序被停住了,你需要做的第一件事是查看E序是在哪里停住的。当你的E序调用了一个函敎ͼ函数的地址Q函数参敎ͼ函数内的局部变量都?x)被压?#8220;?#8221;Q?/font>StackQ中。你可以?/font>GDB命o(h)来查看当前的栈中的信息?/font>
下面是一些查看函数调用栈信息?/font>GDB命o(h)Q?/font>
BacktraceQ?/font>bt 打印当前的函数调用栈的所有信息?/font>如:(x)
(gdb) bt
#0 func (n=250) at tst.c:6
#1 0x08048524 in main (argc=1, argv=0xbffff674) at tst.c:30
#2 0x400409ed in __libc_start_main () from /lib/libc.so.6
从上可以看出函数的调用栈信息Q?/font>__libc_start_main --> main() --> func()
backtrace <n>Q?bt <n> n是一个正整数Q表C只打印栈顶?/font>n层的栈信息?/font>
backtrace <-n> Q?/font>bt <-n> -n表一个负整数Q表C只打印栈底?/font>n层的栈信息?nbsp;
如果你要查看某一层的信息Q你需要在切换当前的栈Q一般来_(d)E序停止Ӟ最层的栈是当前栈,如果你要查看栈下面层的详l信息,首先要做的是切换当前栈?/font>
frame <n>Q?/font>f <n> n是一个从0开始的整数Q是栈中的层~号。比如:(x)frame 0Q表C栈Ӟframe 1Q表C栈的第二层?/font>
up <n> 表示向栈的上面移?/font>n层,可以不打nQ表C向上移动一层?/font>
down <n> 表示向栈的下面移?/font>n层,可以不打nQ表C向下移动一层?
上面的命令,都会(x)打印出移动到的栈层的信息。如果你不想让其打出信息。你可以使用q三个命令:(x)
select-frame <n> 对应?frame 命o(h)?/font>
up-silently <n> 对应?up 命o(h)?/font>
down-silently <n> 对应?down 命o(h)?/font>
查看当前栈层的信息,你可以用以下GDB命o(h)Q?/font>
frame ?f ?x)打印出q些信息Q栈的层~号Q当前的函数名,函数参数|函数所在文件及(qing)行号Q函数执行到的语句?/font>
info frameQ?/font>info f q个命o(h)?x)打印出更?f)详细的当前栈层的信息Q只不过Q大多数都是q行时的内内地址。比如:(x)函数地址Q调用函数的地址Q被调用函数的地址Q目前的函数是由什么样的程序语a写成的、函数参数地址?qing)倹{局部变量的地址{等?/font>如:(x)