http://c.biancheng.net/view/3871.htmlhtml
本节咱们来介绍一下使用 Qt 编程过程当中经常使用的术语和名字,它们不必定专属于 Qt,在其它的 C/C++ 开发过程当中也会使用到。linux
Project 的中文翻译是“项目”或者“工程”,这里的项目是指为实现某个相对独立功能的程序代码合集,这些代码不仅仅是放在一块,而是有相互之间的关联性,而且有专门负责管理该项目的项目文件,好比:c++
集成开发环境一般都是依据项目文件(.pro/.vcproj)管理和构建项目。程序员
即生成脚本,虽然能够直接调用编译器如 g++ 编译程序,可是若是项目里的代码文件变多了,哪些代码文件更新了须要从新编译,哪些代码没有改不须要从新编译等等,靠程序员本身记忆去处理是比较麻烦的事,还有哪些代码须要预处理或是连接哪些库文件, 这些都是繁杂的过程。为了规范程序的编译生成过程,产生了规范化的生成脚本,就是 Makefile,生成器 make 能够依据规范的 Makefile 自动生成目标程序或库文件。
简单的说,就是定义好 Makefile ,让程序员只须要去关注如何编写代码,而生成程序过程当中的脏活累活都交给 make 程序。
如今 Makefile 一般都有工具自动生成,如 qmake 工具, 这样就大量减轻了程序员的负担。编程
Debug 即调试,Release 即发行。代码编写以后,生成的目标程序或库文件一般不会绝对正确,或多或少有些毛病(bug), 所以须要进行纠错调试(Debug)。调试过程当中须要源代码和二进制目标程序之间一一对应的关系, 这样才能定位到错误代码,因此 Debug 版本的程序是臃肿而不进行优化的。
与之相对的是 Release 发行版,在纠正了发觉到的错误后,须要发布程序用于实际用途,实际应用时强调运行效率高,减小冗余代码,所以会对二进制程序进行大量优化,提高性能。这样发布的二进制目标程序就是 Release 版。
Debug 版本和 Release 版本使用的库文件不同:函数
时代在变化,C++ 标准也在前进。C++ 正式公布标准有 C++9八、C++0三、C++11。最新的 C++11 标准是2011年8月12日公布的,在公布以前该标准原名为 C++0x 。这是一次较大的修订和扩充,建议读者专门学一下。
Qt 从 4.8 版本就开始用 C++11 新特性了。编译器里面开始支持 C++11 的版本是 MSVC 20十、GCC 4.五、Clang 3.1,这以后版本的编译器都在逐步完善对 C++11 的支持,如今新版本编译器对新标准的支持都比较全面了。
Qt 官方在编译 Qt5 库的时候都是开启 C++11 特性的,若是咱们要在本身项目代码启用新标准,须要在 .pro 文件里面添加一行:工具
CONFIG += c++11性能
若是是 Qt4 版本则是添加:优化
gcc:CXXFLAGS += -std=c++0xui
MSVC 编译器默认开启 C++11 特性,GCC(g++命令)则须要本身添加选项 -std=c++0x ,上面 CXXFLAGS 就是为 GCC 编译器(g++命令)添加 -std=c++0x 选项。
Dynamic Link 即动态连接,Static Link 即静态连接。
目标程序一般都不是独立个体,生成程序时都须要连接其余的库,要用到其余库的代码。对于多个程序同时运行而言,内存中就可能有同一个库的多个副本,占用了太多内存而干的活差很少。
为了优化内存运用效率,引入了动态连接库(Dynamic Link Library),或叫共享库(Shared Object)。使用动态连接库时,内存中只须要一份该库文件,其余程序要使用该库文件时,只要连接过来就好了。因为动态库文件外置,连接到动态库的目标程序相对比较小,由于剥离了大量库代码,而只须要一些连接指针。
使用动态库,也意味着程序须要连接到如 *.dll 或 *.so 文件,得提早装好动态库文件,而后目标程序才能正常运行。
静态库就是将连接库的代码和本身编写的代码都编译连接到一块,连接到静态库的程序一般比较大,但好处是运行时依赖的库文件不多,由于目标程序本身内部集成了不少库代码。
Linux/Unix 系统里静态库扩展名通常是 .a,动态库扩展名通常是 .so 。Windows 系统里 VC 编译器用的静态库扩展名通常是 .lib,动态库扩展名通常是 .dll 。
MinGW 比较特殊,是将 GNU 工具集和连接库从 Linux/Unix 系统移植到 Windows 里, 有意思的状况就出现了,MinGW 使用的静态库扩展名为 .a ,而其动态库扩展名则为 .dll, .a 仅在生成目标程序过程当中使用,.dll 则是在目标程序运行时使用。
Explicit Linking 即显式连接,Implicit Linking 即隐式连接,这两种都是动态连接库的使用方式。
动态连接库一般都有其导出函数列表, 告知其余可执行程序可使用它的哪些函数。可执行程序使用这些导出函数有两种方式:一是在运行时使用主动加载动态库的函数,Linux 里好比用 dlopen 函数打开并加载动态库,Windows 里通常用 LoadLibrary 打开并加载动态库,只有当程序代码执行到这些函数时,其参数里的动态库才会被加载,这就是显式连接。显式连接方式是在运行时加载动态库,其程序启动时并不检查这些动态库是否存在。
隐式连接是最为常见的,全部的编译环境默认都是采用隐式连接的方式使用动态库。隐式连接会在连接生成可执行程序时就确立依赖关系,在该程序启动时,操做系统自动会检查它依赖的动态库,并一一加载到该程序的内存空间,程序员就不须要操心何时加载动态库了。好比 VC 编译环境,连接时使用动态库对应的 .lib 文件(包含动态库的导出函数声明,但没有实际功能代码),在 .exe 程序运行前系统会检查依赖的 .dll,若是找不到某个动态库就会出现相似下图对话框:
MinGW 是将动态库的导出函数声明放在了 .a 文件里,程序运行依赖的动态库也是 .dll 。 请注意,VC 连接器使用的 .lib 文件分两类,一种是完整的静态库,体积比较大,另外一种是动态库的导出声明,体积比较小。MinGW 连接器使用的 .a 文件也是相似的,Qt 官方库都是按照动态库发布的,静态库只有本身编译才会有。