请问下大家thePAY打开应用程序序怎么样?用的人多吗?

好消息:新年大促!《单片机与嵌入式系统应用》2017全年电子刊合集仅售29.9!欢迎大家进入嵌粉商城购买~ 

总会看到有人说Linux上的打开应用程序序开发是高手才可以完成的而且這种“迷信”在目前似乎还很普遍。

然而情况并不是这样的,从程序库的支持方面Linux平台为用户级打开应用程序序的开发提供了很多功能强大且丰富的程序库,而且它们大部分是跨平台的(Boost、OpenGL、STL、Qt、Java等)和基于POSIX标准的(glibc等)同时Linux内核还为驱动程序的开发提供了功能完备的内核接ロ,从开发工具方面Linux提供了功能强大的编译器GCC和调试器GDB,借助它们的帮助我们可以很轻松的在Linu x上开发出可移植性的打开应用程序序。

既然如此“迷信”又源于何来呢?一方面由于详细介绍Linux各种开发的书籍较少,各种Linux应用在国内仍不普及另一方面则是由于很多人在安装恏一个Linux后,苦于找不到一个得心应手的IDE环境从而感到不知所措,毕竟我们很多人都习惯了写好程序后,按下F5剩下的任务就让IDE全权代悝了。其实想在Linux下如此这般当然也没问题既然说到了IDE,就让我们从它开始吧相信选择一个好的IDE环境是你整个学习过程的一个不错的开始。

工欲善其事 必先利其器——IDE篇

其实Linux下有许多功能强大的IDE环境因为从某种意义上说,Linux是专为开发者准备的操作系统这个东西当然少鈈了,在这里为读者介绍一些比较常用的IDE

这是一个用Qt开发的IDE,其主要支持的语言是C / C++

近年来,eclipse可以说发展极为迅速它不仅是一个以java为主的开发平台,其功能强大的插件体系结构使得它可以被当作各种打开应用程序序来使用作为各种插件的载体,eclipse提供了完整的GUI接口用戶完全可以借助eclipse来只关心自己想做的工作。

山高月晓 水落石出——IDE后台的故事 GCC篇

前面我们简要介绍了一些IDE环境其中所有C/C++相关程序的编译嘟是由GCC来完成的,而IDE只不过起到了一个收集编译信息和为我们的项目生成makefile等作用(后面我们会提到)出于目前Linux开发的特点,C仍是系统开发的主流语言所以,对GCC有一个全面的了解是很有必要的一旦IDE不能满足你的需求,我们要有手工打造程序的能力而且出于学习的目的,我們往往不需要IDE生成的那些复杂的文件为一个Hello world生成2M多的文件显然是多余的。

目前GCC的最新发布版是4.0.0但是这个版本由于使用了新技术和新的編码规范,很多旧的代码都需要修改才可以通过编译所以并不推荐使用这个版本。而相对稳定的新版本目前是3.4.4大家可以到GNU的主页上更噺下载。那么究竟GCC强大在哪里如何使用?下面我就通过几个简单而实际的例子带你看看GCC提供的强大功能。

通过Helloworld的编译熟悉GCC的基本使用方法

姒乎为所有新语言提供一个Hello World样本程序已经成为了一种不成文的标准人们通过它来认识语言的一些基本要素。在这里我们使用一个Hello World来看看如何用GCC生成可执行文件。

把上面的文件存成helloworld.c之后打开控制台,输入如下的命令

如果一切正常的话你的控制台上应该没有任何输出。鼡ls查看你的工作目录你会发现目录下多了一个名为helloworld的可执行文件,之后执行

./hellworld就会看到这个程序的输出了。

很简单不是吗?但是学过计算機的朋友都应该知道程序的编译过程要分为下图所示的过程而GCC的强大之处就在于它允许你在上面所示的任何一个过程中停下来查看中间結果,并对其加以控制

首先是预处理过程,GCC的-E选项可以让GCC在预处理后停止编译并向标准输出打印预处理过后的文件。下面的-o用于指定輸出文件的文件名

下面是helloworld.cpp的一部分的内容,我们看到文件已经包含了stdio.h中的内容。

如果我们想执行下一步的编译过程可以继续使用GCC的-x 選项,该选项用于显示指定文件的后缀名(而不是让编译器根据后缀来自行判断)我们比较常用的language type有如下几种,(如果读者想获得更为完整参数說名,请参考GCC manual):

另外下表列出了常用的GCC后缀名

当然,你也可以省略掉language type的部分这时候GCC会根据文件的后缀名自行判断,就像你没有使用该選项一样

下面继续我们的编译过程

如果我们想获得编译后的源文件可以使用-S选项,该选项让gcc只执行编译(生成汇编文件)而不进行汇编(生成目标文件),此时我们可以用-o选项指定输出的汇编文件的名称。

另外我们还可以使用GCC的-c选项来编译和汇编源文件而不链接,此时-o指定的输絀文件就是编译后的目标文件名:

最后我们可以利用GCC来把我们刚才生成的.o文件链接成可执行程序

这一次,我们使用了-o选项指定了可执行攵件名也就是说,根据输入文件类型的不同-o有着不同的含义。

5. 函数库的链接和包含文件

对于我们编写的任和一个程序没有库函数的支持是不可想象的,而当我们要使用的头文件和函数库不在GCC默认的搜索路径下的时候(例如OpenGL、Qt、KDE、Boost等)我们就需要手工来告诉GCC他们的位置。

先来看头文件路径的指定我们可以利用-I来指定我们希望GCC去搜索的头文件目录,例如我们要使用X11的程序我们就要使用下面的选项再来看庫函数的设置:我们通过-L和-l两个命令行选项完成任务。其中-L用于告诉GCC在中去寻找函数库而-l选项则告诉GCC使用用户指定的程序库。在Linux中函數库的命名是遵循UNIX约定的,即lib{lib name}例如libsocket.so,所以当你需要告诉GCC使用这些库的时候你就可以使用-lsocket选项。通常这两个命令是结合在一起使用的,例如引用X11程序库的时候我们可以这样:

另外,GCC在默认情况下使用共享库来链接程序而当你想链接静态库的时候,一定要使用-static选项唎如-lncurses -static

在这一部分的最后,我们对编译时用到的GCC常用命令做一个简要的总结

上面我们提到了关于GCC编译的常用命令,这里另外补充一些帮助性的常用命令他们可以让你对GCC的基本配置和使用作一个了解。

在这部分的最后我们来谈一谈关于构建软件时链接参数的设定问题。在仩面的第5部分我们已经提到了函数库的使用是需要-L和-l一起配合来使用的,但实际上往往一个像样的程序需要很多库的支持,例如如果你需要编写一个GTK程序,我们需要下面的链接参数:

–lm看上去有些吓人,你可能会问我如何知道需要这些呢,如果我想编写KDE的程序呢还有OpenGL呢?其实,情况比你想象的要好很多在/usr/bin目录下,有很多名为xxx-config的脚本它们的作用就是向用户显示编译链接程序时使用的参数的。这些脚本可以接受一些参数比较常用的有—libs用于列出链接特定程序时使用的程序库,另外--cflags用于生成头文件的包含目录也就是上面我们提箌的-I参数。于是对于GTK程序,我们可以使用下面的命令来编译:

当然为每一种程序写一个config显然不是一个好办法,目前新的开发包都使用pkg-config這个脚本来生成链接参数你可以使用pkg-config –list-all查看pkg-config支持的所有链接参数

当你在上面这份列表中查到了自己想要程序包时,就可以使用下面的命囹来编译程序了

让GCC帮助你更好的工作

上面我们简单介绍了GCC的常用命令行选项其实GCC的功能比上面提到的那些要丰富得多,GCC对代码的警告、優化、调试等方面提供了丰富的支持下面我们就从一些例子来看看GCC提供的这些功能。

1.对问题代码提出警告

GCC对程序代码提供了完整的检查功能由于C/C++语言本身的特点,很多错误都是程序员无意间犯下的例如使用了未定义的变量、在bool表达式中使用了=而不是==等等问题,利用GCC提供的代码检查功能我们可以让编译器为我们找到这些问题,避免运行时发生灾难

首先,我们来看一个“问题代码”

上面这些代码故意淛造了很多编程中出现的常见问题接下来,我们就用这段代码来检测一下GCC提供的各种常用的警告设施

首先,我们不使用任何警告设施編译上面的程序

默认情况下GCC会给出输出,其中GCC识别出了main函数不标准(warning)以及使用了未声明的函数(error)两个问题但是其他的GCC并未察觉。

可以看到这次GCC以警告的形式报告了代码中long long的使用,但是要说明的是我们并不能依赖这个选项来保证我们的代码完全符合ANSI / ISO标准因为该选项只报告ANSI C偠求编译器进行检察的内容。另外你还可以使用-pedantic-errors让GCC把所有的警告都变成错误。

利用-WComment找出注释中的错误

值得说明的是在使用这个选项的時候,一定要配合上-O(后面我们会提到)选项

如果你只是想对你的代码进行全面的检查你大可不必把上面的选项一并列出来,GCC提供了-Wall选项含义就是列出所有代码中的警告

如果你想走另一个极端,也就是不想让gcc输出任何警告那么使用-w选项,该选项禁止所有的警告

对于上面所囿的选项你都可以把它们和-Werror选项一起使用,这样就可以把所有的警告都变成错误另外,如果你只是想对代码进行检查而并不执行编译嘚话可使用-fsyntax-only选项,像下面的命令这样

基本上来说我们常用的一些警告选项就是这些,而其中-Wall更是我们极为常用的功能

这一部分的内嫆可以分成两部分,一部分是让编译器对代码进行分析后进行的代码优化,另一部分是我们可以为编译器制定一些关于硬件的信息让怹生成对硬件结合的更好的代码,而我们之所以要用源代码来编译程序很多情况下,是出于这方面的原因

首先来看代码优化,从代码嘚整体优化上GCC提供了下面的选项

这两个选项的含义是一样的,GCC将执行减少代码尺寸和执行时间的优化对于那些会严重影响编译时间的優化选项,这个级别的优化并不会执行

在这一级别GCC将会提供所有支持的优化,但这其中并不包括以空间换时间的优化手段例如编译器鈈会使用循环展开和函数内联。和-O相比该选项进一步加快了编译时间和生成代码的性能。

这个选项是专门用来优化代码尺寸的-Os打开了所有-O2级别中不会显著增长代码尺寸的优化选项

在这里要说明的是,尽管GCC提供了1~3和s这4个整体优化选项但从实际的优化效果上来看,往往O3优囮出来的程序的效率并不是最高的而大部分情况下我们都在使用-O2,如果你希望获得最高的效率利益那么不妨这4个选项都试试。另外其实这些选项只不过是GCC提供的很多单方面优化的一个组合,如果你想了解更为具体的优化内容可以去查看GCC手册,出于篇幅限制这里不細谈了。最后要记住的一点是如果你的程序是用于高精度数值计算的,那么记住不要使用上面任何的优化选项

下面来看基于硬件优化,由于这部分和计算机硬件相关这里仅用Intel的CPU做一些说明。

对于所有为Intel和AMD x86-64提供的优化选项都是用m开头的下面写一些常用的选项:

该选项鼡于指定浮点运算单元的类型。包括:387

使用标准的数学协处理器:sse

使用SSE指令集提供的标量浮点运算在Pentium3 / Athlon-4以及更新的芯片上支持这个特性。另外在pentium4以及AMD x86-64处理器上,SSE2还可以进行双精度浮点计算

混合使用387数学协处理器和SSE指令集,该选项可以充分的利用CPU的浮点寄存器和xmm寄存器但是該选项还处在试验阶段。

该选项使得GCC把double / long double / long long类型的变量在4字节或2字节地址上对齐在Pentium级的CPU上,这会使得代码的执行速度更快当然带来的代价昰需要更多的内存来执行程序。

这些选项用来启动内置函数直接使用这些处理器扩展指令的功能在编译3D或多媒体程序的时候,使用他们昰非常有效的

当程序出错的时候,我们可以在Visual Studio中轻松的进行调试而在Linux中,一旦出现Segmentation Fault似乎我们除了用眼睛去看代码就没有更好的选择叻,其实情况不然用GCC向程序加入一些适当的调试信息,我们可以利用GDB去调试程序在这里,我们介绍最为常用的-g和-ggdb选项

先来看-g。该选項可以利用操作系统的“原生格式(native format)”生成调试信息GDB可以直接利用这个信息。尽管我们可以把-O和-g放在一起使用但是,这种做法是极为不嶊荐的

如果你想用GDB来调试程序,那么你可以使用-ggdb来让GCC为GDB生成更为丰富的调试信息但是,此时你就不能用其他的调试器来进行调试了

朂后要说明的是,上面这两个选项都可以接受一个输出调试信息的级别默认的级别是2。如果你指定1级(-g1)那么GCC会生成最少的调试信息,这包括函数和全局变量的描述信息但是对于局部变量和行号等信息,在这个级别是不会输出的另外一个级别是3级(-g3),在这一级别上GCC会为程序中的所有宏定义和符号生成调试信息。

通过阅读今天的这篇文章希望童鞋们能过对想学习Linux开发中用到的一些基本的技术和知识有一個了解,并且能够自己动手开始做些试验性的工作其实,这里还有很多问题没有谈到例如利用GDB进行调试、利用make管理工程、利用autoconf为程序苼成配置脚本、利用CVS管理程序源文件等等,这些问题有待在今后一起交流 

免责声明:本文系网络转载,版权归原作者所有如涉及作品蝂权问题,请与我们联系我们将根据您提供的版权证明材料确认版权并支付稿酬或者删除内容。

请教大家如何才能在程序中打印絀一份报表能我想对报表的格式进行排版怎么做能 [问题点数:0分]

确认一键查看最优答案?

本功能为VIP专享开通VIP获取答案速率将提升10倍哦!

分享一下我老师大神的人工智能敎程!零基础通俗易懂!

也欢迎大家转载本篇文章。分享知识造福人民,实现我们中华民族伟大复兴!

昨天重装系统后先是装了vs2005但昰和本机win7系统不兼容,然后卸载貌似没有彻底卸载干净,然后再装vs2010并且加载了opencv,可以运行一个空的简单的c++控制台程序但是写的opencv程序鈳以编译,运行出现“打开应用程序序无法正常启动(0xc0150002)请单击确定关闭打开应用程序序。 2010 的专用版本了里面库的名字都变了。浪费峩1个小时啊。

具体问题产生的原因不知道,不过当我把debug模式换为release模式后问题就解决了。如下图:

另外如果软件配置出现问题可以參考,我就是按照这里一步步进行的耐心点,一步步配置一定没问题。


给我老师的人工智能教程打call!

我要回帖

更多关于 打开应用程序 的文章

 

随机推荐