转自:安祺智能技术(anchey.com)
今天在虚拟机上测试设备时,发现了VS2008编译的libusb0.dll对VC++ 9 的 Runtime 库有依赖性。使用/MT选项编译的话,这个dll有100多K。显然不行。终于明白为什么libusb-win32使用gcc编 译这个dll了。
花了4个小时的时间,在资料几乎没有的情况下,搞明白了官方推荐的 MinGW/Msys 编译方法。在这里鄙视一下libusb- win32项目组,编译方法寥寥几行就说完了,简单也就罢了,结果还没有用。
所以下面的VS2008编译的方法就仅供大家参考吧。高手就不用了,新手的话,可能还能加深对编译的理解。
libusb-win32项目组提供的编译方法说明
This folder contains batch files to compile libusb-win32 with Microsoft's DDK.
Requirements:
1) Use WinDDK 6001.18002 for Windows 2000 to Windows 7 compatibility.
(NOTE: WinDDK 6001.18002 is that last to support Windows 2000)
How to compile:
1) install the DDK
2) open a DDK build environment, either a "checked" or a "free" one
3) launch one of the following batch files to compile the sources:
make_driver.bat: builds the driver
make_dll.bat: builds the DLL
make_install_filter.bat: builds install-filter.exe utility
make_test.bat: builds the command line version of the test tool
make_test_win.bat: builds the Windows version of the test tool
make_all.bat: builds everything, driver, DLL, and the test tools
---------------------------------------------------------------------------------------------------------------
MinGW/Msys编译方法
同样的,这个也需要WINDDK。MinGW只是完成了VS2008的功能,编译的脚本libusb-win32的开发包里已经有了,我 们只要略加修改make.cfg文件就可以了,make.cfg中WINDDK路径的修改请参照下面的介绍的方法。
MinGW是一个很开放的WINDOWS下的编译器,你可以放心的把它应用在商业上,并且这个也是免费的,具体的参见MinGW的 License。MinGW可以像cygwin一样的安装方式——只要一个下载管理器就能下载,管理MinGW的软件包。
只要选择最小安装就可以了。为了方便日后使用,你也可以选择安装g++和gmake。这些只占用一百多兆的空间。
然后,再修改make.cfg中DLLTOOL的路径,我装在E盘,这是我的make.cfg的相关内容
; Path to gcc dlltool tool (http://www.mingw.org/)
; (optional)
DLLTOOL=E:\MinGW\bin\dlltool.exe
编译方法。
使用命令提示符,进入到ddk_make文件夹中,输入make.cmd。这时会自动打印帮助文件,(可恶的libusb-win32项目组竟然 把帮助文件藏在这!)
输入make.cmd "arch=x86"进行编译。OK。。
//==================================================================================
最近STM32 的USB应用似乎很火,刚好我也有个项目涉及到USB驱动。因为之前一直用USBASP为AVR单片机下载程序,所以对 USBASP所用到USB通信库libusb-win32有个名字及出处的印象。终于,5天前天对她有了第一步的了解。USB我也是新手,刚接触几天而 以,但这两天用自己编译的驱动跟STM32通信上后,还是小有点成就感的。拿人家的手短,得了好处,自然要为她宣传鼓噪一番,本着开源共享的精神,厚着脸 皮班门弄斧开了这个帖。当然,还是那句话,不看广告,看疗效。到底好不好用,就由列位看官自行斟酌。
在此我还推荐一个调试libusb-win32很好的一个例程,那就是STM32的 Virtual_COM_Port 例程,用这个你 可以很快的上手libusb-win32的库。闲话少说,下面我们进入正题。
国际惯例,还是先介绍一下libusb-win32,下面是抄的别人的(纠正一下,现在libusb-win32也支持 WINDOWS VISTA/WINDOWS 7了)。。。
//----------------------------------------------------------
LibUSB-Win32是一个用于Windows操作系统(Win98SE、WinME、Win2k和WinXP)上的通用USB设备驱动程 序。该驱动程序允许使用者在不写任何一行核心驱动程序代码的情况下,可以访问Windows系统上的任意一个USB设备。该驱动程序具有以下特点:
l 能够与任意一个已安装的USB设备进行通信
l 可被用作自己开发的USB设备的驱动程序
l 支持批量和中断传输
l 支持USB规范中定义的所有标准设备请求
l 支持USB设备制造商的自定义请求
LibUsb-Win32是由http://libusb-win32.sourceforge.net发布的,遵守 GNU Lesser General Public License(LGPL)和GNU General Public License(GPL)许 可协议。这些协议明确规定:允许LibUsb-Win32用于商业软件,而不只是开源软件。
通过使用七个函数,就可以与USB设备进行简单通信了,通信的主要流程可分为以下四步:
1) 调用usb_init函数,进行初始化。
2) 打开要进行通信的USB设备的句柄。首先依次调用usb_find_busses、usb_find_devices和 usb_get_busses这三个函数,获得已找到的USB总线序列;然后通过链表遍历所有的USB设备,根据已知的要打开USB设备的 ID(VID/PID),找到相应的USB设备;最后调用usb_open函数打开该USB设备(在这里假设总线上没有相同VID和PID的USB设备。 如果总线上存在着相同VID和PID的设备,还需要进行其他条件判断,比如设备名称,以保证是打开的是期望的USB设备)。
3) 与USB设备进行通信。使用usb_control_msg函数,向USB设备读取数据或写入数据。
4) 关闭USB设备。完成所有操作后,调用usb_close函数关闭已经打开的USB设备。
//----------------------------------------------------------
再来介绍一下编译工具。
MSVC(KIT里带的工程文件是VS2008的,如果你使用VS2005或VC6的话,就要自建工程了,libusb-win32的工 程比较复杂,不推荐。我使用的是Visual studio 2008 RTM 90天试用版的)
BCC(如果你装了Borland C++ Builder的话,只要修改make.cfg,然后运行ddk_make文件夹下对应的批 处理文件就可以了,这里我就不介绍了)
上面两个都是用来编译libusb-win32的动态链接库、相关工具和DEMO程序的。我们还需要WINDDK来编译驱动,即生成 libusb0.sys文件。从官方提供的make.cfg文件上来看,使用的是WINDDK 7600.16385.0(WINDOW XP及以上版 本) WINDDK 6001.18002(WINDOWS 2000及以下版本)。我只在MICROSOFT的官网上找到最新 的 WINDDK 7600.16385.1,所以,我用的是这个。
有了VS2008和WINDDK,我们就可以开始下面的工作了。
下载源码
你可以去官网上直接下载源码,地址是http://sourceforge.net/projects/libusb-win32 /files/
也可以通过SVN工具从 https://libusb-win32.svn.sourceforge.net/svnroot /libusb-win32 libusb-win32 检出最新的源码,我使用的是SVN工具是TortoiseSVN。
vs2008的项目文件位于projects文件夹中。我们来看一下
总共有7个项目。
inf-wizard——设备驱动安装信息文件生成向导。此向导可以扫描计算机上的USB设备,并可以获取你选择的设备的VID及PID 生成inf文件。
install-filter——filter驱动安装。filter driver 是驱动的高层境界,杀毒软件,防火墙,笔记本的多 功能按键等等都会用到。
libusb-dll——动态链接库,生成libusb0.dll。上面说的“7个函数”就封装在这里面。同时生成了 libusb0.lib文件,供你的程序链接,这个文件实现了libusb0.dll的装载。
libusb-sys——USB驱动,生成驱动文件libusb0.sys。大家不要误以为是VC++编译的,其实是makefile项 目,WINDDK玩的借腹生子的把戏,借的VS的腹。
testbulk——libusb-win32的 ”Hello,World!“。
testlibusb——顾名思义,实现了libusb-win32驱动的设备的遍历并打印一部分设备描述信息。
testlibusb-win——WINFORM版的testlibusb。
编译
既然工程都建好了,先编译再说,报错了再查错找错。按 F7 编译怎个解决方案。
没有报错,但libusb-sys生成目录下也没有libusb0.sys文件。答案在这里,libusb-sys是靠WINDDK来编 译链接的。这有点像我用VS2005的IDE配合WINAVR来开发AVR单片机一样的了。
查看libusb-sys的项目属性页,在[配置属性]的[NMAKE]栏里,查看“生成命令行”。
CD "$(ProjectDir)..\ddk_make"
CMD /C make.cmd "arch=x86" "app=driver" "noclean=true" "outdir=$(OutDir)" "DIR_INTERMEDIATE=$(IntDir)" "debugmode=true"
看来编译脚本是这个ddk_make文件夹下的make.cmd了。
在这里
SET MAKE_CFG=!DIR_LIBUSB_DDK!make.cfg
查看这个make.cfg文件。
打包的那些我就不说了,我们看看关键的两个东西。
; Default WinDDK directory(s) Adjust these values to match your environment
; (REQUIRED)
WINDDK_BASE=Z:\WinDDK
WINDDK_DIR=!WINDDK_BASE!\7600.16385.0\
;
; (optional)
WINDDK_W2K_DIR=!WINDDK_BASE!\6001.18002\
呵呵,WINDDK放在这。在这里我想八卦一下。看他们把WINDDK放在Z盘,我猜他们是不也是用虚拟机大法无限制的使用90天试用版 的呢?呵呵,纯属猜测,如有雷同,实属巧合。
把这两项改成你的WINDDK安装路径即可。比如我的是
; Default WinDDK directory(s) Adjust these values to match your environment
; (REQUIRED)
WINDDK_BASE=E:\WinDDK
WINDDK_DIR=!WINDDK_BASE!\7600.16385.1\
;
;没找到WINDDK6,也暂时不打算编译WINDOWS2000及以下版本的驱动,所以就注释掉了
; (optional)
;WINDDK_W2K_DIR=!WINDDK_BASE!\6001.18002\
编译一下libusb-sys。error.h 和error.c 会报 warning C4819,有个时候,编译器会把这个 warning当作error,使得不能成功编译,按编译器提示的方法,用VS2008重新保存一下这两个文件即可。OK。。
为Virtual_COM_Port安装我们的这个驱动吧。先用inf-wizard生成inf文件。分别复制libusb0.sys和 libusb0.dll至x86文件夹下。
手动安装此驱动,这个就不用我多说了吧,大家都会。
运行testlibusb-win测试下设备。报错!
R6034错误,这个错误是因为没有将资源清单嵌入到libusb0.dll中。我们可以使用mt工具将资源清单嵌入到exe或dll中。因为 libusb-win32提供的工程文件默认配置是没有生成清单文件的,所以我们还要设置一下。
libusb-dll项目属性页->链接器->清单文件;把 [生成清单] 设为 “是”,重新生成libusb-dll
开始 ->Microsoft Visual Studio 2008->Visual Studio Tools->Visual Studio 2008 x64 兼 容工具命令提示;
cd 入libusb-dll的生成目录
mt.exe –manifest libusb0.dll.manifest -outputresource:libusb0.dll;2
[本文为 安祺智能技术(anchey.com) 原创]