关于usbd.lib的具体生成可以参考PUBLIC/COMMON/CESYSGEN/makefile
在public/common/cesysgen/makefile里有如下usbd规则(我过滤了不相关的规则)
usbd::
@set TARGETLIBS=$(OWNSTATICLIB)
usbd::
@set RELEASETYPE=OAK
@set CPL=
usbd::
@set DLLENTRY=_DllMainCRTStartup
usbd::
@set TARGETTYPE=DYNLINK
@set DEFFILE=$(SG_INPUT_LIB)/$@.def
@set TARGETLIBS=%%TARGETLIBS%% $(SG_OUTPUT_SDKLIB)/coredll.lib
@set SOURCELIBS=
@set TARGETNAME=$@
$(MAKECMD) /NOLOGO $(SG_OUTPUT_OAKTGT)/$@.dll
这些规则拼接起来就是usbd的makefile 规则。从上面的规则可以看出,usbd是个dll,你说的usbd.lib是usbd.dll的导出库。而usbd_lib.lib是usbd.dll的静态库,也就是说usbd_lib.lib是usbd.dll的源码库,里面有usbd.dll的主要源码。usbd.lib只是很小的导出库,只包含usbd.dll的导出函数的信息,用来被需要调用usbd.dll导出函数的模块导入。这2个lib是不一样的,如果用usbd_lib.lib替换usbd.lib,肯定有很多link error。
编译public/common/oak/drivers/usb/usbd目录就可以生成usb_lib.lib
因为usbd.dll的规则在public/common/cesysgen/makefile里,所以usbd.dll需要用命令sysgen usbd或者在PB UI上sysgen出来。sysgen在生成usbd.dll的同时,也会生成它的导出库usbd.lib
usbd_lib.lib是usbd.dll的源码库, 编译public/common/oak/drivers/usb/usbd目录就可以生成usb_lib.lib
usbd_lib.lib大概160K, usbd.dll大概20K.
我dumpbin /all usbd_lib.lib和dumpbin /all usbd.dll,对比了两者的结果:
1. lib里包含了多有内部函数和变量的符号,比如?LoadGroupDriver@@YAHPAUSDevice@@PAHPBU_USB_INTERFACE@@HHH@Z
,也就是LoadGroupDriver(struct SDevice *,int *,struct _USB_INTERFACE
const *,int,int,int)的C++编译内部名字。而这些信息在dll里没有。
2. usbd_lib.lib里包含完整usbd.obj和usbddrv.obj的内容。当然,这两个obj的内容肯定有重复的,比如可能的头文件里的code。 当link.exe连接lib到usbd.dll时,link.exe会做优化:去掉obj之间重复的,去掉obj里没有被引用的代码。
3. lib里包含了很多源文件和头文件的全路径文件名。dll里没有。
4. lib里包含了debug$F/debug$S等节区,dll里没有。
但我不确定是否还有别的区别导致了文件大小的差别。但static lib比它最终生成的dll大是肯定的,因为lib包含了很多信息,比如这个lib里包含了哪些符号,这个lib需要引入哪些符号。link.exe需要这些信息来判断link时的库是否满足需求,否则就会遇到常见的unresolved symbol之类的link error。