1. 首页 > 热点 >

g++编译选项_编译grub

cmd中使用jac对整个包编译怎么办?对包里面的某几个ja文件编译怎么办?

然后把/home的文件夹删除了 rm -rf 文件夹

jac的编译单位其实就是单个的ja文件,为了达到同时编译多个ja文件的目的,可以将所需编译的ja文件路径保存在一个txt中,比如sourcelist.txt,以换行为分隔符(这个过程称为类文件注册)。这些ja文件没有彼此联系的必要,它们可以是隶属不同的包、在不同的文件夹下(当然建议包路径相同的ja类文件放在同一文件路径下),jac命令只会一行一行地读取其中的记录,作为一个单位进行类编译。

g++编译选项_编译grubg++编译选项_编译grub


(用正则表达式筛选出目录列表中 头字母为'd' 的内容--目录)(^是正则表达式开头部分)

举例说明。假设你的这个包放在src文件夹下,src的父目录为project,sourcelist.txt也事先新建在project文件夹下。首先将这个包中你需要编译的ja文件相对于src的路径(如src\com\test\Test.ja)注册到sourcelist.txt文件中;接着在project文件夹中新建一个bin文件夹(或者class文件夹,命名随你乐意取),用以编译后class文件的放置(这个配以jac命令中-d选项去理解);如果还有其他类库(如jxl.jar或者mysql.jar),建议在project目录下新建一个lib(同样命名不限)文件夹,然后到该文件夹下(配以-classpath选项理解);检查上述准备工作都完成,win + R、输入cmd都不用讲,现在在cmd中用cd命令切换到project目录,然后输入命令:

jac -classpath lib/jxl.jar -sourcepath src @sourcelist.txt -d bin

现在就很好理解了。-d选项就是destination的意思,即生成class文件被送到该选项后面的bin文件夹;-classpath就是将你要用到的jar包注册到类加载路径中;-sourcepath就是告诉jac命令去哪里Dim g_Name$ 定义字符串变量g_Name$找类文件。

呢,为了方便,可以在project文件夹下新建一个bat文件,并输入以下内容:

jac -classpath lib/jxl.jar -sourcepath src @sourcelist.txt -d bin

@pause

这样每次直接点击即可,而你需要编译其他包的或者其他ja文件,直接在sourcelist.txt文件中添加或修改。这其实也是一种“弱耦合”、模块化的表现。

makefile中的-C选项到底是干什么的

2)在下面的"在连接器命令行加入以下命令" 下的编辑框上加上: -g3

这个-c与makefile无关,这是C语言编译器cc的一个指令,意思是只生成目标文件(即这里的main.o文件),不进行链接生成可执行文件的作。

可以看到显示没有调试符号表信息,我们重新用-g编译选项试试:

执行

ELSE IF a < 0 THENcc --

就可以看到对于选项的解释了。

cc -c main.c 说明是把 -c 参数传给 cc ,你当然要看cc命令的帮助来了解-c的含义了,man cc 就行了。

如果是传给make的参数,那么就必然是用 make -xxx 的方法来传……

AVR单片机M128 用ICCV7编译 progisp烧写 不嵌入子程序 单片机运行正常 调用子程序就不可以正常运行 例如:

--路径 cd /dev

请问不可以正常运行的现象是?

我用Atm如 whereis lsega64也遇见这个问题,不知楼主解决没有,特来请教!

编译通过了么?

编译有没有参数:通过?

如何使用Dev C++调试c程序

Mfco42d.dll

DEV-C是个IDE,它的编译器是MinGW

开发环境会根据选择的芯片类型(51还是ARM)选择对应的编译器,并根据芯片类型配置整个项目的初始设置,其中有些设置(例如编译选项、芯片衍生库的包含关系、仿真所用的动态链接库等等)是关键性的,直接影响到编译、连接的成功性与正确性。

一、使用单步调试和观察变量的步骤:

1. 编译通过(ctrl+F9)

2. 设置断点(ctrl+F5)

3. 调试(F8)

4. 增加观察变量(在左边的debug观察窗口右键增加或者F4)

5. 单步调试:F7

6. 结束调试:ctrl+alt+f2

简单来说,它有两种方式,一种是源码debug,即分析源码来找出bug位置,一般使用printf()打印出程序执行每一步的信息,一种是可执行文件debug,需要使用调试器来进行。

1.源码debug。类似于下面的源码,主要通过程序执行时输出的信息,来定位bug出现的位置,然后再修改源码。

例如:

#include

void f() { ; }

int main(){

#ifdef _DEBUG

printf("start main function!\n");

#endif

void fa.命令替换();

#ifdef _DEBUG

printf("lee main function !\n");

#endif

return 0;

}2.可执行文件调试,windows平台常用的就是vs/vc自带的调试,另外一个就是微软自家开发的调试器windbg。Linux平台以gdb为常用。

下面以dev-C++为例:

1)在“工具”-》编译选项-》"编译时加入以下命令"下面的编辑框里加上: -g3

3)转到程序页,把gcc行修改为:gcc.exe -D__DEBUG__,

4)把g++行修改为: g++.exe -D__DEBUG__ ,

5)点击确定,重新编译,就能调试了。

VS2008关闭当前窗口命令

gcc filename.c -o filename

:方式一:

END IF

点击”开始”菜单, 指向 “Microsoft Platform SDK” > “Open Build Environment Windows” > “Set Windows XP 64 Build Environment”, 然后点击”Set Windows XP 64 Build Environment (Debug)”, 这时, 一个控制台窗口将显示, 一行文本显示像” the build environment set for a 64-bit”.

功能:清空屏幕

方式二:

在命令提示符下,

1. 点击”开始”菜单, 然后点击”运行”

2. 键入”command.exe”(没有引号), 然后, 点击”确定”

3. 变化当前目录到C:\Program Files\Microsoft SDK(你的SDK安装目录), 然后键入”SetEnv.bat /XP64”(没有引号)

现在, 开始启动Visual C++ 6.0并用我们刚才配置好的创建环境

1. 在同一个命令窗口中(也就是你刚才设置64位环境的命令行窗口), 打开Visual Studio.

2. 键入 “Msdev /useenv”(没有引号). 请注意, 不要打开一个新的命令行窗口, 再去打开Msdev.exe, 现在Visual C++ 6.0 IDE已经显示, 并且include, library及executable目录均被设置为64位的创建环境(注:查看这些配置, 点击Tools > Options > Directories, 在”Show directories for: “下拉列表中查看相应目录配置).

译注: 在前面的设置64位创建环境变量 , 已经将IDE的executable执行目录调整到SDK的相应目录下面, 也就是说, 作为可执行程序: 编译器和链接器是在SDK目录中, 而不再是默认的\Microsoft Visual Studio\Common\Msdev98\Bin

添加一个64位Debug配置

1. 在Visual C++ IDE中, 打开一个已经在的32位工程(例如: MyApplication)

2. 在”Build”菜单上, 点击”Configurations”.

3. 在”Configurations”对话框上, 点击”Add”.

4. 在”Add Project Configuration”对话框上, 设置”Configuration”到Debug64, 然后, 在”Copy Settings from”列表框中点击”MyApplication – Win32 Debug”

5. 点击”OK”完成设置, 点击”Close”关闭.

设置激活配置为64位

1. 在”Build”菜单上, 点击”Set Active Configuration”.

2. 点击”MyApplication – Win32 Debug64”, 然后, 点击”OK”.

修改编译器和链接器的参数配置

由于64位的编译器和链接器的参数配置和32位的有些不一样, 我们需要修改部分选项, 下面是这些配置步骤:

1. 在”Project”菜单中,点击”Settings”.

2. 在”Project Settings”对话框中, 点击”General”标签. 在”Output directories”, 在”Intermediate files” 和”Output files”输入框中, 键入”Debug64”(没有引号)

3. 在”C/C++”标签上, 在”Debug ”下拉列表中, 选择”Program database(参数选项对应是 /Zi)

4. 在”Link”标签上, 在”Project options”的输入框中, 变化”/machine:I386”(没有引号)到”/machine:IA64”(没有引号)

译注: 正确设置应是: /machine:AMD64

5. 在”View”菜单上, 点击”Workspace”.

6. 然后, 移除帮助文件MyApplication.hpj

7. 如果你的应用程序是基于MFC的, 你必须添加一个MFC路径以避免链接错误:LNK1004 on the Mfc42d.lib, 请按下面步骤作:

b. 在”Directories”标签上, 在”Show directories”下拉列表中, 选择”Library Files”, 现在添加你的平台库所在路径: ”\Microsoft SDK\lib\IA64\mfc”(没有引号)

译注补充: 在”C/C++”标签上, 在”Preprocessor definitions”输入框中将WIN32改成WIN64

创建并调试这个工程

现在Build这个工程, 生成64位应用程序, 这个应用程序被部署在一个IA64计算机上.

要在Visual C++ 6.0中运行这个.exe文件, 按下面步骤:

注意: 你不能够在Visual C++ 6.0 IDE中调试这个.exe文件.

a. 在你的IA64计算机上, 创建一个文件夹: C:\VC6MSVCMON

从X86(32位)计算机上拷贝这些文件到这个新创建的文件夹中:

Msvcmon.exe

Dm.dll

Msdis110.dll

Tln0t.dll

上面这些文件应在你的Visual C++ 6.0安装目录下:

\Visual Studio\Common\MSDev98\Bin

b. 在拷贝完这些文件后, 在IA64计算机上运行Msvcmon.exe, 然后, 点击”Connect”.

c. 在X86(32位)计算机上, 打开Visual C++ 6.0 IDE, 在”Build”菜单上, 点击”Debugger Remote Connection”.

d. 在”Remote Connection”对话框中, 点击”Network TCP/IP”, 然后, 点击”Settings”.

e. 在”Target comr name of address”输入框中, 键入IA64计算机的名称. 点击”ok”两次, 关闭对话框.

f. 在Visual Studio C++ IDE中, 在”Project”菜单上, 点击”Settings”, 在左侧面板, 展开”MyApplication”, 然后, 点击”Debug”标签. 你将注意到”Executable for debug session”输入框包含了MyApplication.exe的路径, 看起来是C:\\MyApplication.exe.

g. 在”Remote executable path and file name”输入框中, 键入”MyApplication.exe”(没有双引号)所在的全路径, 这个路径看起来像: \\\C$\\MyApplication.exe(没有引号).点击”OK”关闭该窗口.

h. 按下CTRL+F5或在”Build”菜单上点击”Execute MyApplication.exe”, 开始运行这个.exe文件, 这个.exe文件现在是运行在IA64计算机上.

注意:如果MyApplication是一个MFC应用程序并且这个工程用到了MFC相关的.dll文件, 请确信在IA64计算机上, 那些.dll文件从\Microsoft SDK\NoRedist\Win64文件夹中已被拷贝到\System32文件夹中.

译注:\Microsoft SDK\NoRedist\Win64存放的是debug和release版本的MFC, ATL相关dll(64位), 实际上你也可以拷贝这些dll文件到你的可执行.exe文件所在同一目录中.

这些dll文件是:

Mfc42d.dll

Msvcrtd.dll

译注补充: 编译/链接中经常遇到的问题:

链接出错, 通常是RTC, cookie错误, 参见下面链接设置:

链接中如出现 Error Spawing bscmake.exe

去掉勾选编译参数(Project settings > c/c++): Generate Browse Info

如果仍不成功, 请仔细检查在菜单项”Tools” > “Options” , 定位在”Directories”标签, 选择”Executable Files”, 在下面的目录列表中, 将\bin路径放在项.(这个目录中的64位编译器和链接器程序将重载旧的32位设置).

如果你是动态库和主应用程序链接, 必须保持用的是相同运行时库, 例如: 全部都是Multi-Threads DLL(点击”Project” > “Settings”, 选择”C/C++”标签, 在”Category”下拉列表中选择”Code Generation”, 在下面”Use runtime library”下拉列表中选择).

用Visual C++ .NET IDE创建一个64位应用程序

: 在已安装Visual Studio .NET的计算机上, 请不要同时安装64位版本的WinDbg调试器工具, 请读平台SDK的Readme.doc(位置在: C:\Program Files\Microsoft SDK\Bin\Win64\Readme.doc).

设置64位创建环境变量, 用下面任何一种方式都行:

参照前文相同部分.

开始启动Visual C++ .NET, 并用刚才我们创建好的64位环境

1. 在64位SDK环境设置的命令行窗口中,打开Visual Studio .NET.

2. 键入”dnv /useenv”(没有引号), 然后, 点击”OK”. 现在include, library, executable目录被设置成为64位SDK所在目录.

注意: 如果Dnt.exe不在当前路径(通常是在系统环境变量Path中未指定Visual Studio .NET安装目录), 请改变文件夹路径到\Microsoft Visual Studio .NET\Common7\IDE, 然后再运行上述命令.

:在你运行这个命令后, Visual Studio .NET IDE就被设置成为64位的开发环境, 如果你想清除这个环境, 在打开一个新的Visual Studio .NET IDE之前, 删除在C:\Documents and Settings\\Local Settings\Application Data\Microsoft\VisualStudio\7.0 下的Vccomponents.dat文件.

添加一个64位调试配置

2. 在”Build”菜单上, 点击”Configuration Mar”.

3. 在”Active Solution Configurations”列表中, 点击”New”.

4. 在”New Solution Configurations”对话框中, 在”Solution Configuration Name”下面选择”Debug64”(不包含引号), 并且在”Copy Settings From”下面选择”Debug”.

5. 点击”OK”.

6. 在”Configuration Mar”对话框中, 在”Active Solution Configuration”列表中, 点击选择”Debug64”, 然后点击”OK”.

修改编译器和链接器设置

由于64位的编译器和链接器的参数配置和32位的有些不一样, 我们需要修改部分选项, 下面是这些配置步骤:

2. 在”C/C++”节点, 选择”General”. 设置”Debug Information Format”到”Program Database”(对应的编译选项是/Zi).

3. 在”C/C++”节点中, 选择”Code generation”. 设置”Buffer Security Check”到”No”(对应的编译选项是/GS).

4. 在”Linker”节点, 选择”Command Line”.在”Additional Options”下面, 添加”/MACHINE:IA64”(没有引号).

5. 如果你的应用程序是基于MFC的,你必须添加MFC路径以避免收到链接错误:LNK1104 on the Mfc42d.lib file.

添加MFC路径, 按下面步骤:

b. 在”Projects”下面, 选择”VC++ Directories”. 在”Show directories”列表中, 选择”Library Files”.如果库路径没有列出, 添加这个库路径"\Microsoft SDK\lib\IA64\mfc"(没有引号).

注意:如果MyApplication是一个MFC应用程序并且这个工程用到了MFC相关的.dll文件, 请确信在IA64计算机上, 那些.dll文件从\Microsoft SDK\NoRedist\Win64文件夹中已被拷贝到\System32文件夹中.

这些dll文件是:

Mfc42d.dll

Msvcrtd.dll

完成这些后, 就可以build 64位可执行程序了.

调试工程参照Visual C++ 6.0 IDE部分.

更多参考在:

64-Bit Programming with Visual C++

64位程序移植问题设置64位创建环境变量, 用下面任何一种方式都行:

方式一:

点击”开始”菜单, 指向 “Microsoft Platform SDK” > “Open Build Environment Windows” > “Set Windows XP 64 Build Environment”, 然后点击”Set Windows XP 64 Build Environment (Debug)”, 这时, 一个控制台窗口将显示, 一行文本显示像” the build environment set for a 64-bit”.

方式二:

在命令提示符下,

1. 点击”开始”菜单, 然后点击”运行”

2. 键入”command.exe”(没有引号), 然后, 点击”确定”

3. 变化当前目录到C:\Program Files\Microsoft SDK(你的SDK安装目录), 然后键入”SetEnv.bat /XP64”(没有引号)

现在, 开始启动Visual C++ 6.0并用我们刚才配置好的创建环境

1. 在同一个命令窗口中(也就是你刚才设置64位环境的命令行窗口), 打开Visual Studio.

2. 键入 “Msdev /useenv”(没有引号). 请注意, 不要打开一个新的命令行窗口, 再去打开Msdev.exe, 现在Visual C++ 6.0 IDE已经显示, 并且include, library及executable目录均被设置为64位的创建环境(注:查看这些配置, 点击Tools > Options > Directories, 在”Show directories for: “下拉列表中查看相应目录配置).

译注: 在前面的设置64位创建环境变量 , 已经将IDE的executable执行目录调整到SDK的相应目录下面, 也就是说, 作为可执行程序: 编译器和链接器是在SDK目录中, 而不再是默认的\Microsoft Visual Studio\Common\Msdev98\Bin

添加一个64位Debug配置

1. 在Visual C++ IDE中, 打开一个已经在的32位工程(例如: MyApplication)

2. 在”Build”菜单上, 点击”Configurations”.

3. 在”Configurations”对话框上, 点击”Add”.

4. 在”Add Project Configuration”对话框上, 设置”Configuration”到Debug64, 然后, 在”Copy Settings from”列表框中点击”MyApplication – Win32 Debug”

5. 点击”OK”完成设置, 点击”Close”关闭.

设置激活配置为64位

1. 在”Build”菜单上, 点击”Set Active Configuration”.

2. 点击”MyApplication – Win32 Debug64”, 然后, 点击”OK”.

修改编译器和链接器的参数配置

由于64位的编译器和链接器的参数配置和32位的有些不一样, 我们需要修改部分选项, 下面是这些配置步骤:

1. 在”Project”菜单中,点击”Settings”.

2. 在”Project Settings”对话框中, 点击”General”标签. 在”Output directories”, 在”Intermediate files” 和”Output files”输入框中, 键入”Debug64”(没有引号)

3. 在”C/C++”标签上, 在”Debug ”下拉列表中, 选择”Program database(参数选项对应是 /Zi)

4. 在”Link”标签上, 在”Project options”的输入框中, 变化”/machine:I386”(没有引号)到”/machine:IA64”(没有引号)

译注: 正确设置应是: /machine:AMD64

5. 在”View”菜单上, 点击”Workspace”.

6. 然后, 移除帮助文件MyApplication.hpj

7. 如果你的应用程序是基于MFC的, 你必须添加一个MFC路径以避免链接错误:LNK1004 on the Mfc42d.lib, 请按下面步骤作:

b. 在”Directories”标签上, 在”Show directories”下拉列表中, 选择”Library Files”, 现在添加你的平台库所在路径: ”\Microsoft SDK\lib\IA64\mfc”(没有引号)

译注补充: 在”C/C++”标签上, 在”Preprocessor definitions”输入框中将WIN32改成WIN64

创建并调试这个工程

现在Build这个工程, 生成64位应用程序, 这个应用程序被部署在一个IA64计算机上.

要在Visual C++ 6.0中运行这个.exe文件, 按下面步骤:

注意: 你不能够在Visual C++ 6.0 IDE中调试这个.exe文件.

a. 在你的IA64计算机上, 创建一个文件夹: C:\VC6MSVCMON

从X86(32位)计算机上拷贝这些文件到这个新创建的文件夹中:

Msvcmon.exe

Dm.dll

Msdis110.dll

Tln0t.dll

上面这些文件应在你的Visual C++ 6.0安装目录下:

\Visual Studio\Common\MSDev98\Bin

b. 在拷贝完这些文件后, 在IA64计算机上运行Msvcmon.exe, 然后, 点击”Connect”.

c. 在X86(32位)计算机上, 打开Visual C++ 6.0 IDE, 在”Build”菜单上, 点击”Debugger Remote Connection”.

d. 在”Remote Connection”对话框中, 点击”Network TCP/IP”, 然后, 点击”Settings”.

e. 在”Target comr name of address”输入框中, 键入IA64计算机的名称. 点击”ok”两次, 关闭对话框.

f. 在Visual Studio C++ IDE中, 在”Project”菜单上, 点击”Settings”, 在左侧面板, 展开”MyApplication”, 然后, 点击”Debug”标签. 你将注意到”Executable for debug session”输入框包含了MyApplication.exe的路径, 看起来是C:\\MyApplication.exe.

g. 在”Remote executable path and file name”输入框中, 键入”MyApplication.exe”(没有双引号)所在的全路径, 这个路径看起来像: \\\C$\\MyApplication.exe(没有引号).点击”OK”关闭该窗口.

h. 按下CTRL+F5或在”Build”菜单上点击”Execute MyApplication.exe”, 开始运行这个.exe文件, 这个.exe文件现在是运行在IA64计算机上.

注意:如果MyApplication是一个MFC应用程序并且这个工程用到了MFC相关的.dll文件, 请确信在IA64计算机上, 那些.dll文件从\Microsoft SDK\NoRedist\Win64文件夹中已被拷贝到\System32文件夹中.

译注:\Microsoft SDK\NoRedist\Win64存放的是debug和release版本的MFC, ATL相关dll(64位), 实际上你也可以拷贝这些dll文件到你的可执行.exe文件所在同一目录中.

这些dll文件是:

Mfc42d.dll

Msvcrtd.dll

译注补充: 编译/链接中经常遇到的问题:

链接出错, 通常是RTC, cookie错误, 参见下面链接设置:

链接中如出现 Error Spawing bscmake.exe

去掉勾选编译参数(Project settings > c/c++): Generate Browse Info

如果仍不成功, 请仔细检查在菜单项”Tools” > “Options” , 定位在”Directories”标签, 选择”Executable Files”, 在下面的目录列表中, 将\bin路径放在项.(这个目录中的64位编译器和链接器程序将重载旧的32位设置).

如果你是动态库和主应用程序链接, 必须保持用的是相同运行时库, 例如: 全部都是Multi-Threads DLL(点击”Project” > “Settings”, 选择”C/C++”标签, 在”Category”下拉列表中选择”Code Generation”, 在下面”Use runtime library”下拉列表中选择).

用Visual C++ .NET IDE创建一个64位应用程序

: 在已安装Visual Studio .NET的计算机上, 请不要同时安装64位版本的WinDbg调试器工具, 请读平台SDK的Readme.doc(位置在: C:\Program Files\Microsoft SDK\Bin\Win64\Readme.doc).

设置64位创建环境变量, 用下面任何一种方式都行:

参照前文相同部分.

开始启动Visual C++ .NET, 并用刚才我们创建好的64位环境

1. 在64位SDK环境设置的命令行窗口中,打开Visual Studio .NET.

2. 键入”dnv /useenv”(没有引号), 然后, 点击”OK”. 现在include, library, executable目录被设置成为64位SDK所在目录.

注意: 如果Dnt.exe不在当前路径(通常是在系统环境变量Path中未指定Visual Studio .NET安装目录), 请改变文件夹路径到\Microsoft Visual Studio .NET\Common7\IDE, 然后再运行上述命令.

:在你运行这个命令后, Visual Studio .NET IDE就被设置成为64位的开发环境, 如果你想清除这个环境, 在打开一个新的Visual Studio .NET IDE之前, 删除在C:\Documents and Settings\\Local Settings\Application Data\Microsoft\VisualStudio\7.0 下的Vccomponents.dat文件.

添加一个64位调试配置

2. 在”Build”菜单上, 点击”Configuration Mar”.

3. 在”Active Solution Configurations”列表中, 点击”New”.

4. 在”New Solution Configurations”对话框中, 在”Solution Configuration Name”下面选择”Debug64”(不包含引号), 并且在”Copy Settings From”下面选择”Debug”.

5. 点击”OK”.

6. 在”Configuration Mar”对话框中, 在”Active Solution Configuration”列表中, 点击选择”Debug64”, 然后点击”OK”.

修改编译器和链接器设置

由于64位的编译器和链接器的参数配置和32位的有些不一样, 我们需要修改部分选项, 下面是这些配置步骤:

2. 在”C/C++”节点, 选择”General”. 设置”Debug Information Format”到”Program Database”(对应的编译选项是/Zi).

3. 在”C/C++”节点中, 选择”Code generation”. 设置”Buffer Security Check”到”No”(对应的编译选项是/GS).

4. 在”Linker”节点, 选择”Command Line”.在”Additional Options”下面, 添加”/MACHINE:IA64”(没有引号).

5. 如果你的应用程序是基于MFC的,你必须添加MFC路径以避免收到链接错误:LNK1104 on the Mfc42d.lib file.

添加MFC路径, 按下面步骤:

b. 在”Projects”下面, 选择”VC++ Directories”. 在”Show directories”列表中, 选择”Library Files”.如果库路径没有列出, 添加这个库路径"\Microsoft SDK\lib\IA64\mfc"(没有引号).

注意:如果MyApplication是一个MFC应用程序并且这个工程用到了MFC相关的.dll文件, 请确信在IA64计算机上, 那些.dll文件从\Microsoft SDK\NoRedist\Win64文件夹中已被拷贝到\System32文件夹中.

这些dll文件是:

Mfc42d.dll

Msvcrtd.dll

完成这些后, 就可以build 64位可执行程序了.

调试工程参照Visual C++ 6.0 IDE部分.

更多参考在:

64-Bit Programming with Visual C++

64位程序移植问题

this.Close();

Dev-C++如何调试程序

简单来说,有两种方式,一种是源码debug,即分析源码来找出bug位置,一般使用printf()打印出程序执行每一步的信息,一种是可执行文件debug,需要使用调试器来进行。

1.源码debug。类似于下面的源码,主要通过程序执行时输出的信息,来定位bug出现的位置,然后再修改源码。

例如:

#include

void f() { ; }

int main(){

#ifdef _说明:DEBUG

printf("start main function!

");

#enarea = PI r! r!dif

void f();

#ifdef _DEBUG

printf("lee main function !

");

#endif

return 0;

}2.可执行文件调试,windows平台常用的就是vs/vc自带的调试,另外一个就是微软自家开发的调试器windbg。Linux平台以gdb为常用。

下面以dev-C++为例:

1)在“工具”-》编译选项-》"编译时加入以下命令"下面的编辑框里加上: -g3

3)转到程序页,把gcc行修改为:gcc.exe -D__DEBUG__,

4)把g++行修改为: g++.exe -D__DEBUG__ ,

5)点击确定,重新编译,就能调试了。

据说dev-cpp调试能力为0

其实对于任何编译环境,静态调试才是王道!!!

所谓的静态调试指,

1.用眼睛观察

2.打印中间变量

3.灵活应用("pause")确定出错的位置(有时比debug还要有用!!)

先按Ctrl+F5(或者在"调试"菜单里找到"切换断点")为鼠标所选定的一行设置断点,然后再按F8进入调试模式,再按F7进行单步调试.

只要设置了断点,程序在调试的时候就可以在运行到断点除暂停.只有设置了断点才能进行F7单步调试.

Bloodshed Dev-C++ IDE 调试C++程序

查看变量是查看程序在运行过程中变量的值,可以用来推断程序的运行情况和排错;

单步跟踪是指一步一步地执行程序,可以分析程序的运行情况;

这些都是程序排错的重要工具.

一般的集成开发环境(IDE)都会带有Debug功能的.

我用的就是Dev-C++,会基本的断点调试就行了,可以编译程序了,其实跟踪也容易,打开跟踪对话框,把要跟踪的变量输入就可以了,编译时就会看到变量值的变化

调试程序

点Execute----compile&run即可运行 快捷键是F9

你在main()中加一句while(getchar()!='q');

如果/in 大多是涉及系统管理的命令的存放,只有超级权限用户root才可执行命令存放,普通用户无权限执行此目录下的命令用vc++就不用加这句了~

步步高9688可不可以玩RPG游戏 虚拟BB机

和QB相比较,BB大部分的语法和函数是一样的,当然也有不同的地方。详细的区别和练习。我们将在后面的文章中详细阐述。有QB编程经验的朋友使用BB将非常容易上手。BASIC是自学编程的语言,基本每个自学编程的高手,都有过学习BASIC的经历。因为BASIC本身具有高级语言的基本特性,比如:结构化程序设计,但有很简单。可以让初学编程的朋友把主要的精力放在对编程思想的领悟上,而不用过多的去关注所用语言本身的细节。

章:

例如:连接上面被编译的文件yzdel.obj成为可执行文件的命令行为

--------------------------------------------------------------------------------

程序文件的编写可以使用任意的文本编辑器,例如:windows自带的记事本等。

一、BB的由来

BB是BBK BASIC的简称,是可以开发BBK电子词典程序的一种语言。这个语言采用Quick Basic的语法,方便朋友们开发程序。目前的编译器和连接器版本是1.5,大部分的功能已经支持,基本可以满足用户朋友开发程序的需要。

由于我们的词典用户,多数都是未接触过编程的学生朋友,为了很好的锻炼大家的逻辑思维能力,可以让大家能轻松体会编程的乐趣,我们公司组织专人开发了BBK BASIC这种可以开发在词典上运行的程序的编程语言。这个语言的后继版本将会推出可以在词典机上编程的版本,目前还必须在电脑上编程,生成的最终.BIN文件可以在词典机上运行。

目前已经支持的机型是88/9288/9288T。其他机型的虚拟机将在后期提供。

二、BB的构成

目前BB还没集成的IDE开发环境。

开发环境是由编译器、连接器和基本库构成的。词典机的运行环境就很简单了,只需要一个BB虚拟机。

编译器:BBasic.exe

你所写的BB程序需要经过这个可执行程序编译成虚拟机的汇编代码,汇编代码是以和你程序文件同名的.obj文件存放的。你所写的BB源程序可以以任何扩展名存放,标准的是.bas。

编译器的用法:BBasic.exe + 源程序文件

例如:你的源程序叫yzdel.bas,那么编译它的命令行为

BBasic.exe yzdel.bas

| |

| ————————源程序文件

——————————————编译器

编译后生成的目标文件是yzdel.obj

编译器有几个编译选项,下面分别介绍一下:

-opt:优化编译选项。将会优化你所写的程序,使程序的效率更高,容量更小。Ver1.4以后的编译器都支持本选项。

-r:反字节选项。这个选项的提供,是由于88机型本身的一个问题,所以这个选项也只用在编译88程序时。

-hr:保留注释代码选项。主要用来对比优化是否正确的。普通用户用不到这个选项,可以看懂BB汇编的用户可以

用这个选项查查看是否由于优化造成了你程序错误。

-nc:不连接公共段选项。这个选项任何人都禁止使用。主要用途是我用来调试单行代码生成的。

连接器:Blink.exe

编译后的.obj文件需要经过连接器连接成.bin文件才能最终被虚拟机解释执行。

连接器的用法:Blink.exe + objfile + binfile

Blink.exe yzdel.obj 勇者斗恶龙.bin

| | |

| | ————被连接成的目标文件

| ———————————被连接的OBJ文件,由编译器生成

————————————————连接器

连接后的目标文件为.bin文件才可以被虚拟机识别

连接器的连接选项如下:

-r:反字节选项。这个选项的提供,是由于88机型本身的一个问题,所以这个选项也只用在编译88程序时。

基本库:StdLib.fls和StdLib.lib

StdLib.lib是基本库的索引文件,StdLib.lib是基本库的代码文件。

虚拟机:BB虚拟机.exe

用在词典机上的虚拟机,可执行由连接器生成的.bin文件。

三、BB的模拟器运行

为了模拟屏幕大小不同的机型,模拟器窗口的大小是可以通过函数SETLCD(WID,HGT)来设置的。初始的大小是320×240的,所以若你开发的程序是88/9288使用的话,就不需要重新设置模拟器的大小了。若你开发的机型是9288T的,就需要调用SETLCD(240,160),将模拟器窗口设置为9288T的屏幕大小。

模拟器目前还是固定执行sim\BBasic目录下的test.bin,因此要使你开发的程序可以在模拟上被执行,就必须将你生成的.bin文件copy到sim\BBasic下,并将文件名改成test.bin。

模拟器目前查找资源文件也是固定在sim\debug目录下进行的,所以若你的程序使用了资源文件,请将资源文件copy到该目录下。

完成了以上所有的动作后,即可通过调用sim\debug目录下的GamDev.exe来启动模拟器。

四、BB的词典机运行

BB的词典机环境,主要由对应机型的BB虚拟机.exe和对应机型的BBLoGo.bbs两个文件组成。

BB虚拟机.exe是BB程序可以在词典机上运行的关键程序。

BBLoGo.bbs是BB开头的那个,如下图所示:

想让你的BB程序在词典机上运行?只要将你的.bin文件copy到词典上的“系统\程序\目录”下,和BB虚拟机.exe文件放在同一个目录下,就OK了。很简单吧。^_^

第二章:基础知识

--------------------------------------------------------------------------------

一、数据类型

BB中支持整型(默认类型)、单精度浮点数和字符串三种数据类型。

整型:整型数和数学中的整数是一个概念,不过在计算机中整型数会根据各编译器的异,而可表示的范围不同。数学中的整数可以是[-∞,+∞]中的任意整数,在BB中,整型数的是在[-2147483648,+2147483647]中的任意整数。

例如:1,-10,9等

单精度浮点型:可以理解成数学中的小数。当然概念是不完全等同的,但在写普通的程序时,不需要太深入的区分它们。在普通的程序中,你看到的小数,都可认为时浮点数。单精度浮点数的取值范围是 正值[+1.40129E-45,3.402823E+38] 负值[-3.402823E+38,-1.40129E-45]。

例如:1.05,3.1415926等

字符串:指在一对双引号之间的若干各字符。BB中的字符串长度是没有限制的,它只会受到你的程序所处环境的物理内存的影响。

例如:"hello world.","中华"等

二、常量和变量

通俗的讲,常量就是在程序运行中不可改变的量;变量是用来存放数据的空间,因此在程序运行中,是可以随时根据需要改变其值的量。举个例子,变量就好比是一个礼品盒,你给朋友送礼物时,可以在这个盒子中放任何你想放的东西,而常量就好比是你放在礼品盒中的礼物,它是不会改变的。当你收到一个礼品盒时,它对你来说,就是一个变量,因为它里面可能放的是任何东西。而当你收到朋友送你的一本书时,这本书就是常量。

对于程序中的变量来说,有个当前值的概念,就是程序运行到某一时刻,变量的值。这就好比你这次用这个礼品盒包了个苹果给你的朋友,那这个苹果就是礼品盒的当前值。

在程序中,你所看到的整数,小数,字符串,都是常量。而变量是由特定的命名规则形成的符号串。对应的,程序中的常量和变量也是有3种类型,分别是整型、单精度浮点数和字符串。

常量例如:10,1.25,"I love BB."等。

变量例如:g_Variable

程序中变量实际是内存地址的名字,变量有特定的命名规则:

1、变量名是以字母开头,可用A~Z,0~9,下划线等组成的字符序列。例如g_Variable,i,name3等

2、序列长度不超过100个。

3、不允许使用关键字做变量名。如函数、语句等。

变量的定义:

目前BB还不支持使用AS定义变量类型,只能使用如下的方法定义。

Dim g_Life% 定义整型变量g_Life% (等价与Dim g_Life)

Dim g_Modulus! 定义单精度浮点数变量g_Modulus!

三、算术运算

在数学中,我们有代数式,有各种运算,将这些概念引进到BB中,就成为算术运算符和算术表达式。

1、算术运算符

在BB中,我们只支持了+(加),-(减,取负),(乘),/(除),MOD(模运算)5种运算符。

MOD是模运算即取余运算。

BB种的运算没有类型自动转换,请各位自己先进行类型匹配。

2、算术表达式

用算术运算符和括号将常量,变量及函数连接起来的式子称为算术表达式。

例如:3X+X-2

3、字符串表达式

用字符串连接符(亦称串加值运算符)将字符串常量,字符串变量连接起来的式子称为字符串表达式。

例如:"BEIJING" + "2008"

四、程序构成

先看个例子:

'CIRCLE.BAS

'CALCULATING THE CIRCLE'S AREA AND THE LENGTH OF CIRCUMFERENCE.

Const PI = 3.14159

Dim r!,s!

Dim area!

Input "ENTER THE CIRCLE'S RADIUS:";r!

s = 2 PI r!

Print "AREA = ";area!,"CIRCUMFERENCE = ";s

End

一个完整的程序程序包括:

(1)、注释

(2)、数据说明

(3)、数据输入

(4)、数据处理

(5)、结果输出

1、注释

语法:' 注释内容

作用:在程序中加入解释性的说明,可提高程序的可读性,方便自己修改BUG或别人阅读你的代码。

注释可单独成行,也可放到其他行后。编译器遇到注释不做任何处理,直接略去。

2、数据说明

语法:DIM 变量名(不支持AS)

作用:告诉编译器变量的数据类型,方便它进行不同的处理。

3、数据输入

详细的数据输入,在第三章的数据输入一节中会详细讲,这里不再重复。数据输入是给程序提供所需要的原始数据。

4、数据处理

对于输入的数据,根据问题的需要进行相应的处理,上例中,则是根据输入的圆的半径求圆的面积和周长。

5、结果输出

将程序计算得到的结果显示出来。

五、行标识符

行标识符(简称行标识)有行号和标识符两种形式。设置行标识的目的是标明转移之目标。

行号由1~40个数字组成,后面不必跟冒号。

标识符由1~40个字母或数字组成,必须以字母开头,并以冒号结束。

例如:

500 print "500是个行号"

GAMEOVER: End 'GAMEOVER是个标识符

第三章:I/O语句

--------------------------------------------------------------------------------

I/O语句即input/output语句,是站在计算机的角度看的输入输出作语句。从计算机内将数据送到计算机外部设备叫“输出”;从计算机外部设备将数据送入计算机叫“输出”。

一、数据输出

输出语句用来将需要显示/保存的数据,向显示器、打印机或磁盘文件输出,供用户查看或保存。

1、屏幕显示语句(PRINT)

功能:在屏幕上显示数据

语法:PRINT [表达式1],[表达式2]...

<1>.表达式可以为一个,也可以为多个。同一个PRINT语句的各表达式之间可用分割符号(逗号,分号)隔开。

<2>.表达式可以是字符串,也可以是数值。若无表达式则输入空行。

<3>.使用逗号分割的表达式之间插入4个空格;使用分号风格的表达式之间无任何插入。

<4>.BB中的PRINT语句不具备计算功能。因此,只可以输出常量或变量的值。

例如:PRINT "A的当前值为:";A

2、打印输出语句(LPRINT)

BB不支持这个语句,这里不做介绍。

3、WRITE语句

BB不支持这个语句,这里不做介绍。

二、数据输入

输入语句是给程序提供需要处理的数据的。

1、赋值语句

功能:将一个数据赋给变量

语法:变量 = 表达式

<1>.QB中可以在赋值语句前使用LET,但基本所有的程序员都不使用这个关键字,所以BB中没有支持此关键字。

<2>.赋值语句中的“=”,叫做赋值号。

<3>.赋值号左边只能是变量,而不能是常量或表达式。因为我们知道,只有变量才是一个礼品盒,也只有礼品

盒才能用来包裹不同的东西(被赋值)。

<4>.赋值语句有运算功能,因此赋值号右边可以是表达式

<5>.一个赋值语句只能给一个变量赋值。

例如:ll = 99

city = ""

2、键盘输入语句(INPUT)

功能:程序执行时从键盘输入数据

语法:INPUT "输入提示字语";变量列表

说明:BB中INPUT语句没做相应的数据类型检查。所以输入数据的类型和个数请在输入提示语中明确指出。

防止用户输入错误的数据。

例如:input "请输入你的年龄:";age

3、行输入语句(LINE INPUT)

BB不支持这个语句,这里不做介绍。

4、读数置数语句(READ/DATA)

功能:从DATA语句给出的数据中读取数据。

语法:READ 变量1,变量2,...变量N

..

.DATA 数据1,数据2,...数据N

<1>.READ和DATA语句必须成对出现,但可以分开放。

<2>.DATA语句中的数据类型必须和READ语句中的变量类型一一对应。

<3>.READ语句中的变量个数不得多于DATA语句中的数据个数。

例如:

Dim name$,score

READ name$,score

PRINT name$,score

READ name$,score

PRINT name$,score

DATA "张三",89

DATA "李四",56

End

5、恢复读数据语句(RESTORE)

功能:从指定的DATA语句行重新读入数据。

语法:RESTORE [行标号]

<1>.RESTORE语句与READ-DATA语句配合使用,用于把“数据指针”恢复到指定的位置。

<2>.若RESTORE语句没有指定行号或行标号,则把数据指针恢复到个DATA语句中的个数据项。

三、键盘相关函数

1、KEYPRESS

功能:检测指定键的状态,若指定键按下返回1,否则返回0

语法:KEYPRESS(KEYCODE)

该函数检测到指定键的状态后立即返回,程序不会在函数内部停留等待。指定的KEYCODE是ASCII码。

例如:

'检测 A 是否按下

IF KEYPRESS(&h41) TEHN

PRINT "A 被按下"

PRINT "A 未被按下"

'其中,&h41是A的ASCII

2、WAITKEY

功能:等待并返回一个按键的键值。

语法:WAITKEY()

该程序进入函数后,若没有按键按下,程序会一直在这个函数中等待,直到有按键按下才将被按下的键值返回。

四、屏幕作语句

1、CLS语句

语法:CLS [0|1|2]

CLS后边所的带的数字,目前BB不做区分,都只执行一个功能。清空整个屏幕,并将输出光标定在(0,0)

2、LOCATE函数

功能:移动屏幕输出光标到指定位置。

语法:LOCATE(行,列)

<1>.QB中LOCATE是语句,在BB中以函数实现了。所以调用时,有部分异。

LOCATE(0,0) 'BB中的调用

LOCATE 0,0 'QB中的调用

<2>.行列的计算方法是根据当前被设置的字体(BB中可通过FONT函数设置)的字符宽度和高度来计算的。

例如:当前被设置的字体是12×12的宋体字,则对应行列的象素坐标是:

行象素坐标 = 行 × 12

列象素坐标 = 列 × 6

3、PIXLOCATE函数

功能:移动屏幕输出光标到指定位置(象素坐标)

语法:PIXLOCATE(x,y)

<1>.本函数是QB没有而在BB中增加的。可以定位你的屏幕输出位置。

<2>.参数x,y就是你要将屏幕输出光标定位到的象素坐标位置。

<3>.注意,这个函数的参数顺序是和LOCATE不同的,LOCATE是先行坐标即Y坐标,而这个函数是先X坐标。

功能:设置当前的显示字体

语法:FONT(字体代号)

<1>.本函数是QB没有而在BB中增加的。可以丰富你的屏幕显示效果。

<2>.字体代号可以是:FONT_12SONG,FONT_12KAI,FONT_12HEI,FONT_16SONG,FONT_16KAI,FONT_16HEI,FONT_24SONG,FONT_24KAI,FONT_24HEI九种字体中的一种。以上9种字体实际只有宋体,楷体和黑体三种,而每种字体又分为12×12,16×16,24×24三种尺寸。

<3>.通过本函数设置字体后,会影响LOCATE函数的行列坐标计算。即不同的字体,使用相同的LOCATE参数,显示的内容也不一定是在相同的屏幕位置。

第四章:分支结构

--------------------------------------------------------------------------------

程序按照程序行的顺序执行,这种结构称为顺序结构。而有些问题需要根据的不同,执行不同的代码,这种结构称为分支结构。

一、块IF语句

功能:根据条件又选择的执行程序。

语法:

IF 条件 THEN

语句块1

语句块2

<1>.IF THEN ELSE END IF为关键字。执行时,计算机首先判断条件是否为真,若为真则执行语句块1,否则执行语句块2。执行完后程序跳转到END IF的下一条语句执行。

<2>.语句块是以段程序,可以包含一条或多条语句。

<3>.上面的写法中,语句块1和语句块2比IF ELSE END IF靠右,这叫程序的缩排。这种格式右利于程序的可阅读性。

例如:

DIM a

Input "请输入A",a

IF a > 0 THEN

print "a > 0"

print "a <= 0"

二、块IF语句的变形

1、省略ELSE语句

功能:确定语句块是否执行

语法:

IF 条件 THEN

语句块

执行时,计算首先判断条件是否为真。若为真,则执行语句块;否则,直接跳转到END IF后的语句执行。

例如:

DIM a

Input "请输入A",a

IF a = 0 THEN

print "a = 0"

功能:提供多种选择

语法:

IF 条件1 THEN

语句块1

语句块2

ELSE IF 条件3 THEN

语句块3

..

.ELSE

语句块N

<1>.IF THEN END IF为必须项,其他为可选项。

<2>.执行时,计算机首先判断条件1是否成立,若成立,则执行语句块1;否则判断条件2是否成立,若成立,则执行语句块2;否则继续判断下一个条件,如果为真,则执行相应的语句块;若所有条件都为假,则执行ELSE下面的语句块N。执行完对应的语句块后,跳转到END IF后的语句继续执行。

例如:

DIM a

Input "请输入A",a

IF a > 0 THEN

print "a > 0"

ELSE IF a = 0 THEN

print "a = 0"

print "a < 0"

三、关系表达式和逻辑表达式

在块IF语句中,我们使用了“条件”来作为判断标准。那么,条件都会由哪些东西构成呢?下面介绍几个基础知识。

逻辑量又叫布尔量,它只又两种值,“真”和“假”。

2、关系运算符

其实就是日常生活中的比较运算。在BB中,有如下几种符号:

符号 意义 等同的数学符号 例子

> 大于 > 5 > 3

< 小于 < 3 < 5

= 等于 = 1 = 1

>= 大于等于 ≥ 4 >= 4

<= 小于等于 ≤ 4 <= 4

<> 不等于 ≠ 1 <> 2

3、关系表达式

用关系运算符将两个算术表达式串联起来的式子,叫关系表达式。关系表达式的值为逻辑值。

例如:上面的例子中的关系表达式的值都为“真”。

4、逻辑运算符

逻辑运算符有:AND(逻辑与),OR(逻辑或),NOT(逻辑非);XOR(异或)等。BB只支持与或非三中逻辑关系运算。

NOT在程序中出现时,你可以理解为“”

具体意义,看下面。

5、逻辑表达式

用逻辑运算符连接关系表达式构成的式子,叫逻辑表达式。逻辑表达式的指为逻辑值。

例如:5 > 3 OR 1 = 1

AND(逻辑与)表达的意义是,当用AND连接的前后两个关系表达式都为真时,这个逻辑表达式的值才为真;其中有一个关系表达式的值为假的话,这个逻辑表达式的值就为假。AND在程序中出现时,你可以理解为“并且”。

例如:5 > 3 AND 1 = 1的值为真,而5 > 3 AND 1 < 1的值为假。

按照我说的理解方法:

5 > 3 AND 1 = 1是这样理解的:5大于3并且1等于1,这句话本来就是对的。所以为真。

而5 > 3 AND 1 < 1是这样理解的:5大于3并且1小于1,这句话本来就是错的。所以为假。

OR(逻辑或)表达的意义是,当用OR连接的前后两个关系表达式中有一个为真,这个逻辑表达式的值就为真。只有当两个关系表达式都为假时,这个逻辑表达式的值才为假。OR在程序中出现时,你可以理解为“或者”。

例如:5 > 3 OR 1 < 0 的值为真,而5 < 3 OR 1 < 0 的值为假。

按照我说的理解方法:

5 > 3 OR 1 < 0是这样理解的:5大于3或者1<0,感觉这句话是对的吗?当然是对的。因为5确实大于3嘛。

而5 < 3 OR 1 < 0是这样理解的:5小于3或者1小于0。呵呵,明显是错的。所以为假。

NOT(逻辑非)表达的意义是,当用NOT修饰一个关系表达式时,这个关系表达式的值和它本来的刚好相反。当NOT在程序中出现时,可以对它后面的关系表达式中的关系运算符加个不来理解。

例如:NOT 5 > 3的值为假,因为5>3为真,使用NOT修饰后,取它的反值,就称假了。

按照我说的理解方法:

NOT 5 > 3是这样理解的:5不大于3,这里给后边的>关系运算符加个不,就是不大于。感觉如何呢?

四、块IF语句的嵌套

在一个块IF语句中包含另一个块IF语句,称为块IF语句的嵌套。嵌套可以是多重的。即在一个块IF语句中嵌套另一个块IF,而在另一个块IF中,又可以嵌套其他的块IF。

但需要注意的是,嵌套必须完全包住,不能出现相互骑跨。

块IF语句嵌套的标准格式如下:

IF 条件1 THEN

语句块1

IF 条件11 THEN

语句块11

语句块12

语句块2

IF 条件21 THEN

语句块21

语句块22

例如:

DIM a

Input "请输入A",a

IF a = 0 THEN

print "a = 0"

IF a > 0 THEN

print "a > 0"

print "a < 0"

五、无条件跳转语句GOTO

功能:改变程序执行的顺序,无条件转移到语句标号所指定的程序行。

语法:GOTO 语句标号

在现代程序设计

什么软件可以把坏道加进G表硬盘的或P表

1. 在”END IFSolution”(中文:解决方案)浏览窗口中, 右键”Pr1. 打开一个已存在的32位工程(例如, MyApplication).oject”, 然后, 点击”Properties”.

硬盘坏道分为逻辑坏道和物理坏道,而逻辑坏道并不是真正意义上的坏道,一般可用清零工具就可修复,因此不会加进坏道表,同时如果是因固件损坏而产生的大量坏道也不是真正的坏道,也不会加进坏道表。要查看是否加进坏道表可用工具查看SMART表里的重映射扇区数量是否增加。另外用PC3000做了P、G表的改动后必须重建编译器才能使改动生效。希望能帮到你

Keil新建工程时选芯片的目的何在?

为了方便程序在电脑上调试,我们提供了一个模拟器环境,模拟器的界面如下:

对于4之后的Keil,选芯片有非常重要的作用。

当然如果你对开发环境十分熟悉的话,也是可以自行手动修改各项配置的……不过这是后话了。

另外……Ke4、FONT函数il并END IF不原生支持430的开发。你去装个IAR。

linux gcc编译参数有什么用?

2、增加ELSE IF语句

在 Linux 系统上,GCC 是一个广泛使用的编译器,可以用来编译 C、C++、Objective-C、Fortran、Ada 和其他语言的程序。在编译程序时,可以使用不同的编译选项或参数来控制编译器的行为,以下是常见的 GCC 编译参数的用途:

-o output_filename,确定输出文件的名称为output_filename,同时这个名称不能和源文件同名。如果不给出这个选项,gcc就给出预设的可执行文件a.out。

-c:只编译源文件,生成目标文件,不进行链接。

-o:指定生成的目标文件名。

-I:指定头文件的搜索路径。

-L:指定库文件的搜索路径。

-l:链接库文件。

-g:生成调试信息。

-Wall:开启所有信息。

-O:控制编译器优化等级,可选值为 0、1、2、3。

-std:指定编译器使用的 C++ 标准版本,如 -std=c++11。

-pthread:链接 pthr1、逻辑量ead 库。

-fPIC:生成位置无关的代码。

-shared:生成共享库。

使用不同的编译参数可以控制编译器的行为,从而获得不同的编译结果。需要根据具体情况选择适当的编译参数。

程序core了,看到的还是问号

ELSE

C程序发布的时候,经常去掉-g编译选项的,那么这就遇到一个问题,当程序运行core dump后,想去调试查看core的具体信息,会发现很多符号都被优化掉了,看到的栈信息要么是问号,要么变量无法打印值; 去掉符号表,却可以让程序体积更小,而且不容易泄漏程序的信息,更安全些。

a. 在”Tools”菜单上, 点击”Options”.

这就产生了矛盾,我们在运行的时候不需要符号表,调试的时候需要符合表,那我们能否把符号表在发布程序的时候删除,调试的时候加载符号表信息那,这样就满足了需要。

为了直观起见,先写个简单的c代码用于演示,代码如下:

编译下:

gdb调试看看:

其实也不是完全没有符号,也还是有不少的,只是没有调试信息,可以用命令查看:

两个符号表的大小是有距的距6个,这个表示符号表的index的个数。 查下段表更清晰:

编译的时候可以采用-g编译,然后发布的时候去掉符号表,可以使用命令:strip。 如下最简单的处理下:

可以看到strip处理过的testdebug,比不用-g 选项的编译出来的test文件更小,通过nm命令验证下,确实任何符号都被删除了,而不用-g编译的文件还可以看到符号信息的。

默认情况下不会产生core文件,加大core文件尺寸:

重新编译运行:

看下core的信息:

调试下看看:

因为没有符号信息,很可惜看不到具体的符号信息,也不知道在哪里core了。

看重点,加载符号文件,这个是直接加载没有用示波器测量一下PORTA,看看io是否在快速翻转,如果是的话那就是因为你的delay函数被编译器优化掉了,检查优化相关的编译选项strip前的文件,是包含符号表的。我们清晰的可以看到core的位置是在第8行。

我们通过命令: eu-strip testdebug -f testdebug.sym 提取testdebug中的符号表,保存为文件testdebug.sym。

我们gdb调试的时候导入这个符号试试:

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 12345678@qq.com 举报,一经查实,本站将立刻删除。

联系我们

工作日:9:30-18:30,节假日休息