封装的原则:隐藏ffmpeg和sdl的实现
当只引用其中库中变量和函数的指针,而不使用其内部的实现,就无需引用头文件,只要前面加一下声明即可。
1. 动态库与静态库
项目会在在win中演示,但终要跨平台
.lib和.dll的区别
为什么项目使用动态库而非静态库?
linux和windows动态库的路径:Linux需要定义查询.so的路径,windows可以自定义路径,也可以直接放在.exe下面
2. 动态链接库的生成
win要编译成动态库的函数需要加上__declspec
__declspec是Microsoft VC中专用的关键字,它配合着一些属性可以对标准C/C++进行扩充。__declspec关键字应该出现在声明的前面。
__declspec(dllexport)用于Windows中的动态库中,声明导出函数、类、对象等供外面调用,省略给出.def文件。 即将函数、类等声明为导出函数,供其它程序调用,作为动态库的对外接口函数、类等。
.def文件(模块定义文件)是包含一个或多个描述各种DLL属性的Module语句的文本文件。.def文件或__declspec(dllexport)都是将公共符号导入到应用程序或从DLL导出函数。如果不提供__declspec(dllexport)导出DLL函数,则DLL需要提供.def文件。
** __declspec(dllimport)用于Windows中,从别的动态库中声明导入函数、类、对象等供本动态库或exe文件使用。**当你需要使用DLL中的函数时,往往不需要显示地导入函数,编译器可自动完成。不使用__declspec(dllimport)也能正确编译代码,但使用__declspec(dllimport)使编译器可以生成更好的代码。 编译器之所以能够生成更好的代码,是因为它可以确定函数是否存在于DLL中,这使得编译器可以生成跳过间接寻址级别的代码,而这些代码通常会出现在跨DLL边界的函数调用中。声明一个导入函数,是说这个函数是从别的DLL导入。一般用于使用某个DLL的exe中。
window桌面程序相当可以生成一些宏来判断是export库还是import库
// 下列 ifdef 块是创建使从 DLL 导出更简单的宏的标准方法。
// 此 DLL 中的所有文件都是用命令行上定义的 XCODEC_EXPORTS符号编译的。
// 在使用此 DLL 的任何项目上不应定义此符号。
// 这样,源文件中包含此文件的任何其他项目
// 都会将XCODEC_API 函数视为是从 DLL 导入的,而此 DLL 则将用此宏定义的符号视为是被导出的。
#ifdef WIN32 //若是Windows
#ifdef XCODEC_EXPORTS //若是导出
#define XCODEC_API __declspec(dllexport) //导出
#else
#define XCODEC_API __declspec(dllimport) //导入
#endif
#else //若不是windows
#define XCODEC_API //定义为空
#endif
创建工程时,默认已经定义了导出export了
3. 使用动态链接库