本帖最后由 VCC 于 2024-11-28 18:14 编辑
稍微研究了一下
不仅链接器有BL51和LX51两个版本
库打包器也有LIB51和LIBX51两个版本
&"C:\Keil_v5\C51\BIN\LIB51.EXE" LIST stc_usb_cdc_8h_data_interrupt.LIB
LIB51 LIBRARY MANAGER V4.30.1.0
COPYRIGHT KEIL ELEKTRONIK GmbH 1987 - 2014
*** ERROR 217: NOT A LIBRARY
FILE: STC_USB_CDC_8H_DATA_INTERRUPT.LIB
&"C:\Keil_v5\C51\BIN\LIBX51.EXE" LIST stc_usb_cdc_8h_data_interrupt.LIB
LIBX51 LIBRARY MANAGER V4.30.1.0
COPYRIGHT KEIL ELEKTRONIK GmbH 1987 - 2014
LIBRARY: STC_USB_CDC_8H_DATA_INTERRUPT.LIB
USB
USB_DESC
USB_REQ_CLASS
USB_REQ_STD
USB_REQ_VENDOR
UTIL 复制代码
分别尝试用LIB51和LIBX51来识别这个lib文件,发现只有LIBX51能识别
显然说明这个库是用LIBX51制作的
进一步查阅文档发现
编译器生成的目标文件obj文件也有OMF51(旧)和OMF2(新)两种格式
LIBX51支持把OMF51(旧)和OMF2(新)打包为OMF2格式的lib文件
LIB51支持把OMF51(旧)打包为OMF51格式的lib文件
测试一下这个lib文件里面的obj文件是什么格式
&"C:\Keil_v5\C51\BIN\LIB51.EXE" TRANSFER stc_usb_cdc_8h_data_interrupt.LIB TO stc_usb_cdc_8h_data_interrupt2.LIB
&"C:\Keil_v5\C51\BIN\LIBX51.EXE" EXTRACT "stc_usb_cdc_8h_data_interrupt.LIB (USB)" TO stc_usb_cdc_8h_data_interrupt_USB.obj
&"C:\Keil_v5\C51\BIN\LIBX51.EXE" EXTRACT "stc_usb_cdc_8h_data_interrupt.LIB (USB_DESC)" TO stc_usb_cdc_8h_data_interrupt_USB_DESC.obj
&"C:\Keil_v5\C51\BIN\LIBX51.EXE" EXTRACT "stc_usb_cdc_8h_data_interrupt.LIB (USB_REQ_CLASS)" TO stc_usb_cdc_8h_data_interrupt_USB_REQ_CLASS.obj
&"C:\Keil_v5\C51\BIN\LIBX51.EXE" EXTRACT "stc_usb_cdc_8h_data_interrupt.LIB (USB_REQ_STD)" TO stc_usb_cdc_8h_data_interrupt_USB_REQ_STD.obj
&"C:\Keil_v5\C51\BIN\LIBX51.EXE" EXTRACT "stc_usb_cdc_8h_data_interrupt.LIB (USB_REQ_VENDOR)" TO stc_usb_cdc_8h_data_interrupt_USB_REQ_VENDOR.obj
&"C:\Keil_v5\C51\BIN\LIBX51.EXE" EXTRACT "stc_usb_cdc_8h_data_interrupt.LIB (UTIL)" TO stc_usb_cdc_8h_data_interrupt_UTIL.obj 复制代码
然后
&"C:\Keil_v5\C51\BIN\LIB51.EXE" CREATE stc_usb_cdc_8h_data_interrupt_lib51.LIB
&"C:\Keil_v5\C51\BIN\LIB51.EXE" ADD "stc_usb_cdc_8h_data_interrupt_UTIL.obj,stc_usb_cdc_8h_data_interrupt_USB_REQ_VENDOR.obj,stc_usb_cdc_8h_data_interrupt_USB_REQ_STD.obj,stc_usb_cdc_8h_data_interrupt_USB_REQ_CLASS.obj,stc_usb_cdc_8h_data_interrupt_USB_DESC.obj,stc_usb_cdc_8h_data_interrupt_USB.obj" TO stc_usb_cdc_8h_data_interrupt_lib51.LIB
&"C:\Keil_v5\C51\BIN\LIBX51.EXE" CREATE stc_usb_cdc_8h_data_interrupt_libx51.LIB
&"C:\Keil_v5\C51\BIN\LIBX51.EXE" ADD "stc_usb_cdc_8h_data_interrupt_UTIL.obj,stc_usb_cdc_8h_data_interrupt_USB_REQ_VENDOR.obj,stc_usb_cdc_8h_data_interrupt_USB_REQ_STD.obj,stc_usb_cdc_8h_data_interrupt_USB_REQ_CLASS.obj,stc_usb_cdc_8h_data_interrupt_USB_DESC.obj,stc_usb_cdc_8h_data_interrupt_USB.obj" TO stc_usb_cdc_8h_data_interrupt_libx51.LIB 复制代码
发现 stc_usb_cdc_8h_data_interrupt_lib51.LIB 文件几乎是空白
而 stc_usb_cdc_8h_data_interrupt_libx51.LIB 文件和原本的stc_usb_cdc_8h_data_interrupt.LIB一模一样
说明这个文件里面打包的是OMF2格式的obj文件
因此无法被lib51打包,只能被libx51打包
对比来看 AI8051U_8_MDU32.LIB 则是OMF51格式的lib文件,因为LIB51和LIBX51都能识别这个文件
> &"C:\Keil_v5\C51\BIN\LIB51.EXE" LIST AI8051U_8_MDU32.LIB PUBLICS
LIB51 LIBRARY MANAGER V4.30.1.0
COPYRIGHT KEIL ELEKTRONIK GmbH 1987 - 2014
LIBRARY: AI8051U_8_MDU32.LIB
AI8051U_8_MDU32
?C?LIMUL
?C?LMUL
?C?SLDIV
?C?ULDIV
?C?ULIDIV
> &"C:\Keil_v5\C51\BIN\LIBX51.EXE" LIST AI8051U_8_MDU32.LIB PUBLICS
LIBX51 LIBRARY MANAGER V4.30.1.0
COPYRIGHT KEIL ELEKTRONIK GmbH 1987 - 2014
LIBRARY: AI8051U_8_MDU32.LIB
AI8051U_8_MDU32
?C?LIMUL
?C?LMUL
?C?SLDIV
?C?ULDIV
?C?ULIDIV 复制代码
判断方法:
OMF51格式的lib文件,文件头0x2C 0x07
OMF2格式的lib文件,文件头0xAC 0x07
obj文件似乎无法通过文件头判断