什么是SDK?包含哪些类型的文件?
SDK(Software Development Kit,软件开发工具包)是一些被软件工程师用于为特定的软件包、软件框架、硬件平台、操作系统等创建应用软件的开发工具的集合。它可以简单的为某个程序设计语言提供应用程序接口API的一些文件,但也可能包括能与某种嵌入式系统通讯的复杂的硬件。最开始的时候,API的集合我们就称之为SDK,例如mac提供的API集合,就称之为mac SDK。随着时间的演化,现在的SDK指的是以一组Api作为输入,以另外一组Api作为输出的中间件。
SDK经常包括示例代码、支持性的技术注解或者其他的为基本参考资料澄清疑点的支持文档。
什么是release、debug?有什么区别?各有什么特点?
Debug 和 Release 并没有本质的区别,他们只是预定义提供的两组编译选项的集合,编译器只是按照预定的选项行动(如果可以还可以反过来)。
Debug:Debug 通常称为调试版本,可以设置断点,观察变量的值来进行查找问题,通过一系列编译选项的配合,编译的结果通常包含调试信息,而且不做任何优化,以为开发人员提供 强大的应用程序调试能力。
Release:Release通常称为 发布版本,是为用户使用的,一般客户不允许在发布版本上进行调试。所以不保存调试信息,同时,它往往进行了各种优化,以此达到代码最小和速度最优。为用户的使用提供便利。
例:程序在Debug模式中运行的很好,而在Release中却不行,是因为Debug会自动给变量初始化,而在Release中则不会,所以要尽可能的给变量或者结构体初始化。
什么是x86、x64?通常选哪种?
x86平台编译出来的exe(可执行文件)或dll(动态链接库)都是32位的。以此类推,x64对应的则是64位的。而Any CPU则是取决于当前的操作系统,若操作系统是32位的,则编译出来的程序就是32位的,反之编译出来的就是64位程序。
主程序(编译出来是exe文件的)是x86平台下编译的,而它所依赖的一个项目(或动态链接库)是由x64位平台编译出来的,则会提示“未能加载文件或程序集...或它的某一个依赖性。试图加载格式不正确的程序。”之类的错误。这是因为32位程序不能加载64位的dll,更不能调用其中的类、方法和对象等。
由于现在的电脑是基本是64位的,所以一般会编译成x64。
什么是静态库、动态库?分别在什么阶段使用?
1、静态链接库:
静态链接库工程编译后,生成.lib文件。 在目的程序使用静态链接库的场合,直接将.lib文件中的全部函数链接到目的程序中。运行生成的目的程序的场合,不再需要.lib文件就可以直接运行。当静态链接库发生变化的场合,目的程序必须要重新编译,否则执行时静态链接库的内容没有更新。
动态链接库工程编译后,生成.lib和.dll文件。 .dll文件是作为共享函数库的可执行文件。不同编程语言编写的程序只要按照函数调用约定就可以调用同一个DLL函数库。适用于大规模的软件开发,使开发过程独立、耦合度小,便于不同开发者和开发组织之间进行开发和测试。DLL文件的内容发生变化时,只要输出接口不变(即名称、参数、返回值类型和调用约定不变),更换DLL文件就好,EXE文件不用再次编译也可以在执行时更新调用DLL函数的内容。极大地提高了可维护性和可扩展性。运行程序时,必须保证.dll是存在的,否则会出错。DLL(Dynamic Link Library,动态链接库,格式为.dll)也是一种可执行文件格式,跟.exe文件不同的是,.dll文件不能直接执行,它们通常由.exe在执行时装入,内含有一些资源以及可执行代码(API函数的执行代码)等。为了使用DLL中的API函数,我们必须要有API函数的声明(.H)和其导入库(.LIB),导入库是为了在DLL中找到API的入口点而使用的。
什么场合下适用静态链接库:
因为静态链接库会使得.exe文件的size变大,并且相对于动态链接库运行速度更快。故静态链接库适用于小型应用的开发。
什么场合下适用动态链接库:
因为静态链接库不能链接其它链接库。所以,当该链接库还需要链接其它的链接库,包括静态或者动态链接库的场合,应该使用动态链接库。
因为动态链接库.dll可以独立于.exe而存在,当开发大型软件的场合,或者说多个应用程序需要链接到该.dll时,.dll的逻辑需要修正的场合,其应用程序不需要再次编译。减少软件的耦合。
由于动态链接库.dll可以链接到不同编程语言的工程,所以对于多语言的软件开发的场合也是适用的。
什么是库目录?什么是包含目录?什么是附加依赖项?
包含目录:#include < .h>中 .h的搜索目录。如果有XXX.h找不到,设置这个目录可以解决。
附加依赖项:lib库 。 C++的库会把函数、类的声明放在.h中,实现放在.cpp或.cc中。编译之后,.cpp,.cc,.c会被打包成一个.lib文件,这样可以保护源代码。所以,要使用一个库,除了要include他的头文件以外,还要在链接过程中把lib加进去。这个就是在附加链接库中设置。其实,一般的库会用#pragma comment(lib,”xxx.lib”) 来设置。这个过程出错会出现link error,大概是“未定义的函数XXX”。
库目录:就是寻找.lib文件的目录。如果设置错误,会link error,提示”找不到XXX.lib“。
包含目录是使用的头文件的集合,每个头文件里包含一个或多个函数或类的声明;附加依赖项是一个lib库,包含函数的具体实现;库目录是lib库的集合。