看libsvm的时候看到了Python中的高级调用方法,用ctypes原生库来调用dll程序,接着看到了cdll,windll,oledll,突然觉得自己在程序的编译连接方面有所欠缺,得学习学习。
首先看dll是什么东西。
dll是动态链接库(dynamic link library),是微软对shared library的实现,其概念是把许多程序共享的函数放到一个文件当中,当初次被调用是,放到内存的共享块当中,所有的进程都可以访问该块内存,这样就节省了宝贵的内存空间。linux中对应的文件的后缀一般为so,例如C的标准库一般叫libc.so。dll本质上和exe并无不同,它可以有数据和程序块(这提供了一种相当危险的IPC),但是dll无法直接运行,它需要有exe文件来载入内存并调用。更加详细的描述见于http://en.wikipedia.org/wiki/Dynamic-link_library。当编译器编译我们编写的程序时要经历link环节,就是确定一系列被调用函数的入口,连接器并不直接连接我们自己编写的目标文件和dll文件,而是链接目标文件和lib文件,lib文件可以粗略的认为是dll中各个函数一个目录,各个函数在dll中的位置,所以在使用opencv的时候,需要把各种lib文件添加到工程,并且把dll添加到系统路径。
言归正传,看看cdll,windll,oledll是什么。这三个修饰符其实是C\C+