编译环境
Linux下的软件开发和编译环境配置

Linux下的软件开发和编译环境配置在Linux操作系统中,配置适合软件开发和编译的环境是非常重要的。
正确地设置开发环境,可以提高开发效率,同时确保软件的质量和稳定性。
本文将介绍如何在Linux下配置软件开发和编译环境,以帮助开发人员顺利进行开发工作。
一、安装必要的开发工具在开始配置软件开发环境之前,您需要安装一些必要的开发工具。
在Linux中,常用的开发工具包括GCC编译器、Make工具、调试器(如GDB)、版本控制工具(如Git)等。
您可以通过包管理器(如APT、YUM等)来安装这些工具。
以下是安装这些工具的示例命令(以基于Debian的系统为例):```sudo apt-get updatesudo apt-get install build-essentialsudo apt-get install gdbsudo apt-get install git```通过执行这些命令,您可以安装所需的开发工具,以便后续的配置步骤。
二、配置开发环境要配置软件开发环境,您需要设置一些环境变量和配置文件。
以下是一些常见的配置步骤:1. 配置PATH环境变量在Linux中,PATH环境变量用于指定可执行程序的搜索路径。
为了方便地访问开发工具和编译器,您应该将它们所在的目录添加到PATH环境变量中。
您可以通过编辑`.bashrc`文件来实现这一点。
打开终端,输入以下命令编辑文件:```vi ~/.bashrc```在文件末尾添加以下行(假设开发工具的路径为`/usr/local/bin`):```export PATH=$PATH:/usr/local/bin```保存并退出文件。
然后,使用以下命令使更改生效:```source ~/.bashrc```现在,您可以在任何目录下直接运行开发工具和编译器。
2. 配置编辑器选择一个适合您的编辑器来编写代码是很重要的。
在Linux中有多种编辑器可供选择,如Vim、Emacs、Sublime Text等。
win32下基于eclipse的GTK+编译环境

win32下基于eclipse的GTK+编译环境GTK+是遵循LGPL协议的一个优秀的GUI类库.基于C语言开发,是GNOME的基础,也是Linux下 GUI程序的首选.同时,GTK+也是一个跨平台的GUI库,win32下写"原生"GUI程序(商业的和非开源的也都不需付费),GTK+都是一个不错的选择! 本文基于我的实践,介绍了windows下用eclipse/CDT 来搭建GTK+编译环境的步骤,并成功编译运行了GTK+的"hello world"程序! 希望对那些想在win32下开发GTK+程序的朋友能有所帮助. 转载请注明出处: http:// 1. 为什么俺选eclipse ?eclipse 是一个开源的优秀的IDE,主要是用于开发调试Java程序.同时它也是一个平台,通过CDT插件可以提供一个完整的C/C++开发环境.eclipse 的主页是 ,上面可以下载到最新的eclipse和CDT,而且还有中文语言包,相当的不错.开始也想过用其它的IDE,比如Dev-cpp (主页) ,可是它的编辑器只支持GBK中文编码,不支持UTF8. 而我们知道GTK+是支持国际化的,所有的c源文件最好是UFT8的. 如果.c文件是GBK编码,那么里面的中文,编译出来都是乱码.要想消除乱码,必须把文件中的所有中文string串通过下面这个函数来转换:g_locale_to_utf8("世界你好",-1,0,0,0)这样很是麻烦.而eclipse支持多种编码,选用utf8来编辑源文件,就没有中文乱码问题啦,很是方便,呵呵eclipse的跨平台性也是我选择它的一个重要原因! 我们知道,linux下vim,emacs对于我们这些习惯了win下的编辑器的来说,还是有点麻烦的. eclipse可以运行在linux等平台上,这样,我们就可以在linux下使用同一个IDE--eclipse来开发啦,这样降低了win程序员编写 linux程序的门槛,呵呵.嘻嘻,总之,eclipse备受业界好评,应该也不会让我们失望的!再说,熟悉了eclipse,以后学习java的话IDE也不用重新去适应啦,^_^2. win32下GNU 编译环境搭建eclipse和dev-cpp这些都是调用MinGW或者Cygin来编译调试C/C++程序的. 建议使用MinGW,它全称是Minimal GNU for Win,是GNU开发工具在win32平台上的一个移植,不同于Cygin,MinGW是原生的win32移植,不需要另外的POSIX模拟中间层的支持.另外MinGW项目也发布了一个最小的posix实现接口--msys,移植了很多linux下很方便的小工具,比如ls,vi,rvxt等等. MinGW项目的主页是我们可以在上面下载最新的MinGW-3.2.0-rc-3.exe 和MSYS-1.0.10.exe 这两个文件,安装的时候先安装Mingw,然后安装msys.安装完msys之后会跳出一个问题,选y (yes), 然后它问你是不是已经安装了MinGW, 选y,然后按它的例子输入MinGW的安装路径(比如c:/MinGW),这样msys就把这个路径mount到了安装路径的msys目录下,可以直接使用Mingw的那些工具了.好了.装好这两个以后我们就要eclipse编译c文件需要的gcc,gdb,make工具了.为了eclipse能找到它们,要把c:\MinGW\ bin目录加到windows的环境变量PATH中. 需要说明的是,c:\MinGW\bin目录下的make不是GNU 的make,而是mingw32-make.exe,这个是make在windows 下的版本,由于没有posix完整接口,这个make缺少一些标准make的功能,同时也有一些linux下make所不具备的功能. 因为我们后面要用到pkg-config来自动配置GTK+库的路径,这是mingw32-make.exe所不支持的. msys中提供的GNU make是可以的,为了使用它,我们还得把msys安装目录下的bin目录加到环境变量PATH中.3. 安装GTK+库的win32 portGTK在windows上的移植,目前常见的主要有两个项目:gimp-win和glade-win32,分别在上有各自的主页.前一个是官方的,不过GTK+-dev包不是完全打包好的,使用起来不是很方便,推荐用后一个.gimp-win的地址:/~tml/gimp/win32/downloads.html/projects/gimp-win/glade-win32的地址:/projects/gladewin32/去下载最新的gtk+-win32-dev 包,双击运行安装就好了.安装程序自动注册了环境变量,很方便.4. 安装eclipse和CDT到上下载eclipse和CDT,解压到同一个目录下,比如D:\eclipse ,运行eclipse.exe 即可注意的是: CDT要搭载对应的版本的eclipse使用,下载时候阅读说明选择正确版本的CDT即可5. 编译GTK+版的hello world程序.打开eclipse,file-> new-> project, 里面多了c和c++两种工程类型,选择c,建一个managed make c project(自动产生makefile文件).eclipse自动关联到c程序的视图,呵呵,真的是挺周到的.左边的工程文件夹那里选new,新建一个 c source file, 把下面的这个hello world 程序拷贝进去,并保存. #################################################################include <gtk/gtk.h>/* This is a callback function. The data arguments are ignored* in this example. More on callbacks below. */static void hello( GtkWidget *widget,gpointer data ){g_print ("Hello World\n");}static gboolean delete_event( GtkWidget *widget,GdkEvent *event,gpointer data ){/* If you return FALSE in the "delete_event" signal handler,* GTK will emit the "destroy" signal. Returning TRUE means* you don't want the window to be destroyed.* This is useful for popping up 'are you sure you want to quit?'* type dialogs. */g_print ("delete event occurred\n");/* Change TRUE to FALSE and the main window will be destroyed with* a "delete_event". */return TRUE;}/* Another callback */static void destroy( GtkWidget *widget,gpointer data ){gtk_main_quit ();}int main( int argc,char *argv[] ){/* GtkWidget is the storage type for widgets */GtkWidget *window;GtkWidget *button;/* This is called in all GTK applications. Arguments are parsed* from the command line and are returned to the application. */gtk_init (&argc, &argv);/* create a new window */window = gtk_window_new (GTK_WINDOW_TOPLEVEL);/* When the window is given the "delete_event" signal (this is given * by the window manager, usually by the "close" option, or on the* titlebar), we ask it to call the delete_event () function* as defined above. The data passed to the callback* function is NULL and is ignored in the callback function. */g_signal_connect (G_OBJECT (window), "delete_event",G_CALLBACK (delete_event), NULL);/* Here we connect the "destroy" event to a signal handler.* This event occurs when we call gtk_widget_destroy() on the window, * or if we return FALSE in the "delete_event" callback. */g_signal_connect (G_OBJECT (window), "destroy",G_CALLBACK (destroy), NULL);/* Sets the border width of the window. */gtk_container_set_border_width (GTK_CONTAINER (window), 10);/* Creates a new button with the label "Hello World". */button = gtk_button_new_with_label ("世界你好!");/* When the button receives the "clicked" signal, it will call the* function hello() passing it NULL as its argument. The hello()* function is defined above. */g_signal_connect (G_OBJECT (button), "clicked",G_CALLBACK (hello), NULL);/* This will cause the window to be destroyed by calling* gtk_widget_destroy(window) when "clicked". Again, the destroy* signal could come from here, or the window manager. */g_signal_connect_swapped (G_OBJECT (button), "clicked",G_CALLBACK (gtk_widget_destroy),G_OBJECT (window));/* This packs the button into the window (a gtk container). */gtk_container_add (GTK_CONTAINER (window), button);/* The final step is to display this newly created widget. */gtk_widget_show (button);/* and the window */gtk_widget_show (window);/* All GTK applications must have a gtk_main(). Control ends here* and waits for an event to occur (like a key press or* mouse event). */gtk_main ();return 0;}######################################################保存之后eclipse马上开始编译啦,有很多错误! 这是为什么啊?不要着急, 这主要是eclipse不知道GTK+的头文件路径,以及不知道与GTK的哪些库文件来连接. 解决这个问题有两种方法:1) 编辑makefile文件,把这些路径以参数-I(include路径) 和-l(gtk的lib文件) 的方式告诉gcc编译时候指定include路径,gcc的参数有(假定GTK装在c:\GTK目录下):-IC:/GTK/include/gtk-2.0 -IC:/GTK/lib/gtk-2.0/include -IC:/GTK/include/atk-1.0 -IC:/GTK/include/pango-1.0 -IC:/GTK/include/glib-2.0 -IC:/GTK/lib/glib-2.0/include连接时候需要指定GTK+ 的lib库,gcc的参数有-LC:/GTK/lib -lgtk-win32-2.0 -lgdk-win32-2.0 -latk-1.0 -lgdk_pixbuf-2.0 -lpangowin32-1.0 -lgdi32 -lpango-1.0 -lgobject-2.0 -lgmodule-2.0 -lglib-2.0 -lintl -liconv有了这些路径参数就可以成功编译了.编辑makefile文件需要有make的知识,容易出错,我们也可以在eclipse的project->properties(工程属性)然后选c/c++ build ,右边的tools setting 标签页里面来一个一个填上这些-I 路径和-l库,目录和库不少,所以这样也比较麻烦.2) 用pkg-config 工具来帮忙生成这些include路径和 lib库也可以用pkg-config 来帮忙生成1) 中繁琐的gcc参数.pkg-config在安装GTK+-dev 时候已经有了,不需要额外安装. 我们可以在cmd窗口中输入: pkg-config --cflags gtk+-2.0 输出的就是include路径的gcc参数, pkg-config --libs gtk+-2.0 输出lib库的gcc参数.这个工具使用起来相当方便,make文件可以写成这样: gcc -o hello.exe hello.c `pkg-config --cflags gtk+-2.0` `pkg-config --libs gtk+-2.0`然后make的时候,make命令就会自动用pkg-config的输出替换掉pkg-config命令(msys中的make.exe可以,而mingw32-make.exe不支持).下面我们就在eclipse里面指定这两个pkg-config命令,让eclipse帮我们生成的makefile可以找到GTK+ 的include文件和lib包.1) project->properties(工程属性),然后选c/c++ build ,右边的tools setting 标签页里面选GCC C++ Complier,这个项目下的选项供我们来设定一些gcc的编译参数.如下图所示选择Miscellanous, 把`pkg-config --cflags gtk+-2.0`填入other flags 的最后面. 如果还有其它选项也可以接在后面(后面我们还要添加一个-mms-bitfields选项).2)连接选项配置. 还是上图,选GCC C++ Linker, 其下的选项供我们配置连接选项.点击Miscellanous如下图所示在Other objects 里面填上`pkg-config --libs gtk+-2.0` 命令.(填上后eclipse会自动又加一个" ",点编辑,去掉这对引号).经我试验, 要是填在最上面的linker flags栏里面的话, `pkg-config --libs gtk+-2.0`选项是放在紧跟gcc后的第一个选项,make时候不会自动替换成它的输出(俺也不知道为何), 而other objects 里面的选项是放在gcc 命令的最后面的,make的时候就可以自动用输出替换,真是奇怪.呵呵.还有,如果想让编译出来的程序没有那个cmd的dos窗口,还需要加一个连接选项-mwindows (如上图中示).这个不管加上边还是下边都可以.点击apply以后,eclipse又开始自动编译啦.这下什么错误也没有了. 到目录树下debug目录下查看,多了hello.o 和hello.exe文件.双击hello.exe运行程序, 呓??? 出来了个错误窗口,说需要加-mms-bitfields 编译参数!!返回来加上这个参数(图1中所示),保存,自动编译,重新运行hello.exe,这下一切OK,我们的第一个GTK+程序诞生了,呵呵,太高兴了!!enjoy GTK! good lucy!。
AMSS编译环境搭建

AMSS编译环境搭建说明: 编译环境说明请参见Qualcomm Release notes(如4075 release note—5.2 Build Host Environment),Host环境注意需要安装gawk工具包(sudo apt-get install gawk)。
编译器安装:1, 安装rvct(只要把rvct的文件夹拷贝到Linux Host PC的某个地址即可)2, 现在可拿到支持Qualcomm 8x50的rvct是2.2版本,目录如下:Rvct/zhaoq/dist_235_linux-pentium //RVCT主要目录Rvct/zhaoq/Linux // armcc文件所在目录(*)用Rvct/zhaoq/Linux目录下的armcc覆盖Rvct/zhaoq/dist_235_linux-pentium/RVCT/Programs/2.2/503/linux-pentium下的armcc, 并在Rvct/zhaoq/dist_235_linux-pentium/RVCT/Programs/2.2/503/linux-pentium执行: # cp armcc tcc# cp armcc tcpp# cp armcc armcpp3, 可能需要修改可执行权限# chmod u+x tcc tcpp armcc armcppLicense安装:在/etc/environment中加入license环境变量指定license地址:LM_LICENSE_FILE=”8960@10.70.26.149”ARMLMD_LICENSE_FILE=”8960@10.70.26.149”关于arm license server说明后面会提到. 其中8960为server的port号,10.70.26.149为server IP. 为了本地测试(不重新启动shell),可以在命令行export这两个环境变量,然后验证license是否通过:# cd Rvct/zhaoq/dist_235_linux-pentium/RVCT/Programs/2.2/503/linux-pentium# ./armcc –vsn (查看命令输出,如果license配置不对,会提示错误).License Server配置:从arm网站获取网络版license(license.dat),此license和服务器网卡(eth0)的MAC地址绑定。
单片机程序编译环境keil使用

一、如何看图上图中:标有“引脚功能”、“引脚序号”、“网络标号”1、引脚功能:为芯片引脚的功能说明,譬如U1为A T89S51,上图中的P0.0/AD0即单片机的P0.0端口;2、引脚序号:在芯片设计生产的时候即已经确定,不能更改。
譬如U1为AT89S51,则39脚为P0.0端口(参考教材);3、网络标号:是为了方便画图且具有电气功能的说明符合,如上图中“D0”表示图中所有标有“D0”的信号线均连接在一块。
入上图中的U1的第39脚和RP1的第2脚是连在一起的。
二、实验板使用注意实验板上的电子元件对静电敏感,禁止用手触碰板子上的元件,拿取实验板时应拿两边。
不要扳动单片机卡座的扳手,也不要随便触摸按键等。
三、单片机程序编译环境Keil的基本使用1、打开Keil uVision3或者Keil uVision42、新建工程在弹出的对话框中新建工程的文件夹,譬如“ad”打开工程的文件夹,创建一个工程名,如“ad”点击保存确定,确定后会弹出一个对话框:这一步是选择单片机的型号,实验中选择“Atmel”下的“A T89C52”,点击确定,会弹出如下对话框:这一步是给工程添加启动单片机的启动代码,选择“是”。
修改工程属性,点击如下图所示的快捷按钮:弹出如下的对话框:将晶振的频率修改为实验板上的频率11.0592MHz,然后选择“OUTPUT”选项卡,勾选“Create HEX Files”,如下图所示:新建程序文件,File-New,然后将新建的文件保存为*.c文件,然后将该文件加入到工程中,具体操作如下:在Source Groups上点击右键,并选择“Add Files to Group ‘Source Group 1’”,在弹出的对话框中选择上面保存的*.c文件。
然后在*.c文件中编写程序。
程序编辑完成后,编译程序,如下图所示:编译后如有错误,根据错误指示修改程序;如无错误,则会生成HEX文件。
四、程序下载程序完成后,将程序下载到单片机后才能运行;1、打开STC-ISP下载程序“STC-ISP.exe”2、安装驱动用USB线连接实验板和PC机,实验板上有2个USB接口,实验中使用USB2接口和PC机相连。
粗略走走kbuild makefile编译流程

kbuild是Linux内核源码中用于管理和构建内核的工具,而makefile 是kbuild的一种配置文件,用于定义内核的编译规则和依赖关系。
本文将对kbuild makefile的编译流程进行详细介绍,包括编译环境的搭建、makefile的结构和语法、编译过程中各个阶段的功能以及常见问题的解决方法。
一、编译环境的搭建1. 安装必要的工具和软件在开始编译之前,首先需要在系统中安装必要的工具和软件,包括gcc、g++、make等。
这些工具和软件通常可以通过系统自带的包管理工具进行安装,或者从官方全球信息湾下载安装包手动安装。
2. 下载内核源码要进行内核的编译,首先需要下载Linux内核的源码。
可以通过git clone命令从官方git仓库中下载源码,也可以从官方全球信息湾下载压缩包并解压缩到本地。
3. 配置编译环境在下载完内核源码后,需要对编译环境进行配置,包括设置环境变量、配置编译选项等。
可以通过修改bashrc文件或者使用export命令来设置环境变量,也可以通过配置.config文件来设置编译选项。
二、makefile的结构和语法1. makefile的基本结构makefile是一个文本文件,通常包含了一系列的规则、变量和注释。
makefile的基本结构如下:target: dependencies[tab] mand其中,target表示目标文件,dependencies表示target依赖的文件mand表示生成target的命令。
每条规则都必须以tab键开始,表示该规则的命令。
2. makefile的语法makefile支持一些基本的语法和操作符,包括赋值运算符、条件语句、循环语句等。
通过这些语法和操作符,可以方便地定义编译规则和依赖关系,实现自动化编译。
三、编译过程中各个阶段的功能1. 准备阶段在准备阶段,make工具会读取makefile文件,并解析其中的规则和依赖关系。
它会根据目标文件和依赖文件的时间戳来确定哪些文件需要重新编译,哪些文件可以跳过。
LUA的编译、环境等

LUA的编译、环境等Lua命令⾏lua命令⾏选项:-i:进⼊交互式-e:执⾏lua代码-l:加载库⽂件例如使⽤下⾯的命令启动lua解释器,可以重新定义lua提⽰符。
lua -i -e "_PROMPT=' try>'"在交互模式下,如果要打印任何表达式的值,可以⽤等号开头,并跟随⼀个表达式,例如:> a="hello" .. "world"> =ahelloworld> =math.sin(180)-0.80115263573383>lua解释器执⾏其参数前,会先查找⼀个名为LUA_INIT的环境变量:如果找到这个变量,并且其内容为“@filename”,那么解释器会先执⾏这个⽂件; 如果LUA_INIT不是以@开头,则作为Lua代码执⾏。
如下⾯的⽰例,将LUA_INIT定义为"@a.lua",然后启动lua解释器,⾃动加载了a.lua⽂件。
root@chenqi-PC:/home/chenqi/studio/test# cat a.lua#!/usr/bin/luaprint("hello world")root@chenqi-PC:/home/chenqi/studio/test# export LUA_INIT="@a.lua"root@chenqi-PC:/home/chenqi/studio/test# luahello worldLua 5.2.2 Copyright (C) 1994-2013 , PUC-Rio>解释器在运⾏脚本前,会⽤所有的命令⾏参数创建⼀个名为arg的table,例如test.lua源⽂件内容如下,for i,v in pairs(arg) doprint(string.format("arg[%d]=%s", i,v))end执⾏后,打印出所有的参数:root@chenqi-PC:/home/chenqi/studio/test# lua -e "sin=math.sin" test.lua a barg[1]=aarg[2]=barg[-1]=sin=math.sinarg[-3]=luaarg[-2]=-earg[0]=test.lua环境Lua执⾏的每段代码,例如⼀个源⽂件,或在交互模式中输⼊的⼀⾏代码,都称为⼀个chunk。
KEIL编译环境优化等级说明详解

KEIL编译环境优化等级说明详解优化级别说明(仅供参考):0级优化:1、常数折叠:只要有可能,编译器就执⾏将表达式化为常数数字的计算,其中包括运⾏地址的计算。
2、简单访问优化:对8051系统的内部数据和位地址进⾏访问优化。
3、跳转优化:编译器总是将跳转延⾄最终⽬标上,因此跳转到跳转之间的命令被删除。
1级优化:1、死码消除:⽆⽤的代码段被消除。
2、跳转否决:根据⼀个测试回溯,条件跳转被仔细检查,以决定是否能够简化或删除。
2级优化:1、数据覆盖:适于静态覆盖的数据和位段被鉴别并标记出来。
连接定位器BL51通过对全局数据流的分析,选择可静态覆盖的段。
3级优化:1、“窥孔”优化:将冗余的MOV命令去掉,包括不必要的从存储器装⼊对象及装⼊常数的操作。
另外如果能节省存储空间或者程序执⾏时间,复杂操作将由简单操作所代替。
4级优化:1、寄存器变量:使⾃动变量和函数参数尽可能位于⼯作寄存器中,只要有可能,将不为这些变量保留数据存储器空间。
2、扩展访问优化:来⾃IDATA、XDATA、PDATA和CODE区域的变量直接包含在操作之中,因此⼤多数时候没有必要将其装⼊中间寄存器。
3、局部公共⼦式消除:如果表达式中有⼀个重复执⾏的计算,第⼀次计算的结果被保存,只要有可能,将被⽤作后续的计算,因此可从代码中消除繁杂的计算。
4、CASE/SWITCH语句优化:将CASE/SWITCH语句作为跳转表或跳转串优化。
5级优化:1、全局公共⼦式消除:只要有可能,函数内部相同的⼦表达式只计算⼀次。
中间结果存⼊⼀个寄存器以代替新的计算。
2、简单循环优化:以常量占据⼀段内存的循环再运⾏时被优化。
6级优化:1、回路循环:如果程序代码能更快更有效地执⾏,程序回路将进⾏循环。
7级优化:1、扩展⼊⼝优化:在适合时对寄存器变量使⽤DPTR数据指针,指针和数组访问被优化以减⼩程序代码和提⾼执⾏速度。
8级优化:1、公共尾部合并:对同⼀个函数有多处调⽤时,⼀些设置代码可被重复使⽤,从⽽减⼩程序代码长度。
grub4dos_BIOS和grub4dos_UEFI编译环境搭建(ubuntu14.04)

grub4dos_BIOS和grub4dos_UEFI编译环境搭建(ubuntu14.04)1、下载ubuntu:如果关机不断电,grub4dos/grub2启动菜单,kernel那⼀句最后加上acpi=force pci=nomsi参数。
3、修改root密码为root,切换到root:点左上⾓第⼀个圆环形图标,输⼊terminal(可以拖动到左侧收藏栏),进⼊bash:ubuntu@ubuntu:~$ sudo passwd rootEnter new UNIX password: rootRetype new UNIX password: rootpasswd: password updated successfullyubuntu@ubuntu:~$ suPassword: root4、ubuntu调整到中⽂界⾯,修正ibus中⽂全拼输⼊法,⽅便输⼊中⽂,⽅便⽹上搜索知识:右上⾓system settings,language support,把汉语拖动到第⼀个,然后点Apply System-Wide,键盘输⼊⽅式选择ibus。
Regional Formats,选择汉语,然后Apply System-Wide。
如果弹出错误thunderbird-locale-en: Depends: thunderbird (>= 1:24.4.0+build1-0ubuntu1),就更新下源: sudo apt-get update点右上⾓齿轮,Log Out,输⼊前⾯设置的root密码,注销之后就可以显⽰中⽂了。
ibus中⽂输⼊法全拼有点⼩问题,如果在拼⾳----⾸选项⾥⾯,设置全拼之后,必须在bash⾥⾯运⾏下sudo ibus restart重启下输⼊法才能确保ibus全拼⽣效。
要想ibus输⼊法⽣效,设置--系统设置--语⾔⽀持--键盘输⼊⽅式应该选择ibus。
5、gcc及其依赖包,根据chenall的提⽰:sudo apt-get install -y gcc-4.8 gcc-4.8-multilib nasm upx upx-ucl p7zip-full texinfo autoconf automake make patch binutils-dev liblzma-dev gawk如果不知道软件包名字,⽤sudo apt-cache search gcc这样⼦的命令进⾏模糊查询。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
VC++6.0编译环境介绍(1)大家可能一直在用VC开发软件,但是对于这个编译器却未必很了解。
原因是多方面的。
大多数情况下,我们只停留在“使用”它,而不会想去“了解”它。
因为它只是一个工具,我们宁可把更多的精力放在C++语言和软件设计上。
我们习惯于这样一种“模式”:建立一个项目,然后写代码,然后编译,反反复复调试。
但是,所谓:“公欲善其事,必先利其器”。
如果我们精于VC开发环境,我们是不是能够做得更加游刃有余呢?Visual C++可新建的 Projects项目Visual C++可新建的 File文件Visual C++的Build设置pile TEST.cpp选项只编译当前文件而不调用链接器或其它工具。
输出窗口将显示编译过程检查出的错误或警告信息,在错误信息处单击鼠标右键,可以得到错误代码的位置2. Build TEST.exe 选项对最后修改过的源文件进行编译和链接3. Rebuild All选项该选项允许用户编译所有的源文件,而不管它们何时曾经被修改过4. Batch Build选项该选项能单步重新建立多个工程文件,并允许用户指定要建立的项目类型.VC提供了两种目标应用程序类型 Win32 Release(发行版)、Win32 Debug(调试版)。
我们先来看一下VC的处理流程,大致分为两步:编译和连接。
源文件通过编译生成了.obj文件;所有.obj文件和.lib文件通过连接生成.exe文件或.dll 文件。
下面,我们分别讨论这两个步骤的一些细节。
工程配置对话框在这个对话框中,左上方的下拉列表框用于选择一种工程配置,包括有Win32 Debug、Win32 Release和All Configurations(指前两种配置一起),某些选项在不同的工程配置中有不同的缺省值。
左边的树形视图给出了当前工程所有的文件及分类情况。
如果我们把工程“Schedule”置为高亮显示(正如图9-1那样),对话框的右边就会出现总共十个选项卡,其中列出了与工程有关的各种选项,不少选项卡中有一个Reset按钮,按下它后可以把选项卡内的各项设置恢复到生成工程时的初始值。
如果我们在树形视图中选择一个文件类或一个文件,那么对话框右边的选项卡会自动减少到一个或两个,其中列出的都是与选中的文件类或文件有关的选项。
编译参数的设置。
主要通过VC的菜单项Project->Settings->C/C++页来完成。
我们可以看到这一页的最下面Project Options中的内容,一般如下:/nologo /MDd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_AFXDLL" /D "_MBCS" /Fp"Debug/WritingDlgTest.pch" /Yu"stdafx.h" /Fo"Debug/" /Fd"Debug/" /FD /GZ /c各个参数代表的意义,可以参考Project Option语法解释。
比如/nologo 表示编译时不在输出窗口显示这些设置(我们可以把这个参数去掉来看看效果)等等。
一般我们不会直接修改这些设置,而是通过这一页最上面的Category中的各项来完成。
1)General:一些总体设置。
Warning level用来控制警告信息,None表示不显示任何警告,L1表示只显示严重的警告,L2表示显示比L1次严重的警告,L4则表示显示出所有的警告,包括那些安全忽略的警告;Warnings as errors 将警告信息当作错误处理,这样在编译完毕后就无法启动连接器来进行连接;Optimizations是代码优化,可以在Category的Optimizations项中进行更细的设置;Generate browse info用以生成.sbr文件,记录类、变量等符号信息,可以在Category的Listing Files项中进行更多的设置。
Debug info,生成调试信息:None,不产生任何调试信息(编译比较快);Line Numbers Only,仅生成全局的和外部符号的调试信息到.OBJ文件或.EXE文件,减小目标文件的尺寸;C 7.0- Compatible,记录调试器用到的所有符号信息到.OBJ文件和.EXE文件;Program Database,创建.PDB文件记录所有调试信息;Program Database for "Edit & Continue",创建.PDB文件记录所有调试信息,并且支持调试时编辑。
2)C++ Language:pointer_to_member representation用来设置类定义/引用的先后关系,一般为Best-Case Always表示在引用类之前该类肯定已经定义了;Enable Exception Handling,进行同步的异常处理;Enable Run-Time Type Information迫使编译器增加代码在运行时进行对象类型检查;Disable Construction Displacements,设置类构造/析构函数调用虚函数问题。
3)Code Generation:Processor表示代码指令优化,可以为80386、80486、Pentium、Pentium Pro,或者Blend表示混合以上各种优化。
Use run-time library 用以指定程序运行时使用的运行时库(单线程或多线程,Debug版本或Release 版本),有一个原则就是,一个进程不要同时使用几个版本的运行时库。
Single-Threaded,静态连接LIBC.LIB库;Debug Single-Threaded,静态连接LIBCD.LIB库;Multithreaded,静态连接LIBCMT.LIB库;Debug Multithreaded,静态连接LIBCMTD.LIB库;Multithreaded DLL,动态连接MSVCRT.DLL库;Debug Multithreaded DLL,动态连接MSVCRTD.DLL库。
连接了单线程库就不支持多线程调用,连接了多线程库就要求创建多线程的应用程序。
Calling convention 可以用来设定调用约定,有三种:__cdecl、__fastcall和__stdcall。
各种调用约定的主要区别在于,函数调用时,函数的参数是从左到右压入堆栈还是从右到左压入堆栈;在函数返回时,由函数的调用者来清理压入堆栈的参数还是由函数本身来清理;以及在编译时对函数名进行的命名修饰(可以通过Listing Files 看到各种命名修饰方式)。
Struct member alignment用以指定数据结构中的成员变量在内存中是按几字节对齐的,根据计算机数据总线的位数,不同的对齐方式存取数据的速度不一样。
这个参数对数据包网络传输等应用尤为重要,不是存取速度问题,而是数据位的精确定义问题,一般在程序中使用#pragma pack来指定。
4)Customize:Disable Language Extensions,表示不使用微软为标准C做的语言扩展;Eliminate Duplicate Strings,主要用于字符串优化(将字符串放到缓充池里以节省空间),使用这个参数,使得char *sBuffer = "This is a character buffer";char *tBuffer = "This is a character buffer";sBuffer和tBuffer指向的是同一块内存空间;Enable Function-Level Linking ,告诉编译器将各个函数按打包格式编译;Enables minimal rebuild,通过保存关联信息到.IDB文件,使编译器只对最新类定义改动过的源文件进行重编译,提高编译速度;Enable Incremental Compilation,同样通过.IDB文件保存的信息,只重编译最新改动过的函数;Suppress Startup Banner and Information Messages,用以控制参数是否在output窗口输出。
5) Listing Files:Generate browse info的功能上面已经提到过。
这里可以进行更多的设置。
Exclude Local Variables from Browse Info表示是否将局部变量的信息放到.SBR文件中。
Listing file type可以设置生成的列表信息文件的内容:Assembly-Only Listing仅生成汇编代码文件(.ASM扩展名);Assembly With Machine Code生成机器代码和汇编代码文件(.COD扩展名);Assembly With Source Code生成源代码和汇编代码文件(.ASM扩展名);Assembly, Machine Code, and Source生成机器码、源代码和汇编代码文件(.COD 扩展名)。
Listing file name为生成的信息文件的路径,一般为Debug或Release 目录下,生成的文件名自动取源文件的文件名。
6)Optimizations:代码优化设置。
可以选择Maximize Speed生成最快速的代码,或Minimize Size生成最小尺寸的程序,或者Customize定制优化。
定制的内容包括:Assume No Aliasing,不使用别名(提高速度);Assume Aliasing Across Function Calls,仅函数内部不使用别名;Global Optimizations,全局优化,比如经常用到的变量使用寄存器保存,或者循环内的计算优化,如i = -100;while( i < 0 ){ i += x + y;}会被优化为i = -100;t = x + y;while( i < 0 ){i += t;}Generate Intrinsic Functions,使用内部函数替换一些函数调用(提高速度);Improve Float Consistency,浮点运算方面的优化;Favor Small Code,程序(exe或dll)尺寸优化优先于代码速度优化;Favor Fast Code,程序(exe或dll)代码速度优化优先于尺寸优化;Frame-Pointer Omission,不使用帧指针,以提高函数调用速度;Full Optimization,组合了几种参数,以生成最快的程序代码。