动态库和静态库以及OpenCV库配置解释

来源:互联网 发布:ps4网络设置 编辑:程序博客网 时间:2024/05/21 23:33

动态库和静态库

 

静态链接库:需要提供生成库的*.h文件和*.lib文件

         在生成库的*.h文件中,声明格式为:

                   extern“C” 函数返回类型  函数名(参数表)

         在*.cpp源文件中,

                   #include“..\lib.h”

                   #pragmacomment( lib, “..\\debug\\libTest.lib”) // 手动添加

// 指定与静态库一起链接的(或者在IDE的lib栏中填入lib文件的路径(自动添加))

 

动态链接库:需要提供*.dll和*.lib,或者只提供*.dll

         1.导出函数,可提供应用程序使用

         2.DLL内部函数,只能在DLL中使用

         DLL的导入导出:(可以参看下面的例子)

                   #ifdefWLL_EXPORT

                   #defineWLL_API_declspec(dllexport)

                   #else

#defineWLL_API_declspec(dllimport)

#endif

(注意,动态库和静态库的*.lib文件不一样。动态库的只含有一些文件的基本信息,文件名之类,不包含函数的实现。)

 

DLL文件的加载方式:(使用dll文件)

静态加载:

                  1.包含DLL中导出的*.h头文件

                  2.采用#pragma comment(lib, “..\\debug\\libTest.lib”) // 导入DLL文件的*.lib文件

或者,在project->setting->Linker->Input的AdditionalDependencies(附加依赖项)中添加*.lib文件。(OpenCV常见的配置方式就是这种)

                  3.将动态库生成的*.dll放到*.exe或者*.dll的同一目录下。

 

动态加载:

                  假设Other.dll有一个int Add (int x, int y ),则调用过程为:

                            Typedefint (*FunPtr)(int , int); // 定义指针函数

                            FunPtrfunPtr;

Handle handle = LoadLibrary(“Other.dll”);

funPtr = (FunPtr) GetProcAddress(Handle, “Add”);

funPtr( 2 , 3 );

FreeLibrary(handle);

                           

 

OpenCV库的配置解释:

         网上常见的都是使用的“静态加载”的配置方法,这样的好处就是不需要每次都去动态加载dll。

         过程一般是:

                   1.在“用户变量”中添加dll文件的所在路径(D:\opencv\build\x86\vc11\bin)

                   2.在“包含目录”中添加需要的*.h的路径

                   3.在“库目录”中添加*.lib文件的路径

                   4.在“附加依赖性”中添加lib文件的全名

然后就配置结束了。这样对于配置的过程就很清晰了。

        

         网上流传着大致两种配置,第一是在属性页“Microsoft.Cpp.Win32.user”中配置。优点是一次配置,终生使用。但是问题是需要将debug和release的lib文件名都输入到“附加依赖项”中(debug和release中都分别有Microsoft.Cpp.Win32.user,但其实本质是一个)。有些程序运行时会有问题(比如stitching)。

         还有一种是新建属性页,然后再进行配置。优缺点也是显而易见的,需要每次配置。

         所以个人建议,学习的时候使用第一种,在工程运用中使用第二种。

 

0 0
原创粉丝点击