在 编译libusb 的事已经过去差不多两个月多了,只要模模糊糊的记得大概的步骤和碰到一些问题.并且要在linux平台 使用usb 打印
编译环境在虚拟机中 linux 系统最好是安装最全最大的,如果不懂的话会很麻烦.
1.编译 编译步骤
2.centos 32位 编译时缺少 缺少libudev
解决方法:https://centos.pkgs.org/7/centos-x86_64/systemd-devel-219-57.el7.i686.rpm.html 下载安装
3.编译程序时 /usr/lib/gcc/i686-redhat-linux/4.8.5/../../../crt1.o: In function `_start':
(.text+0x18): undefined reference to `main'
解决方法:用 pkg-config --libs libusb-1.0查询正确的库路径 没有提示把 /usr/local/lib/pkgconfig
/libusb.pc 拷贝到usr/lib/pkgconfig中或者查看你编译libusb-1.0是否正确
4.编译程序时先用 pkg-config --libs libusb-1.0 或者是pkg-config --libs libusb 查询链接库
5.下面的指令不能颠倒
gcc -fpic -shared libusb.cpp -L/usr/local/lib -lusb-1.0 -o libusbx.so
6. open 时返回-3
解决方法: chmod -R 777 /dev/bus/usb
7.代码跟网上也没有什么区别 只是比别人多了一个步骤,查找通信节点 因为写这个节点可能是 0,1,2..网上的代码写零 在虚拟机上无法通信,而且我也不能手动填写这个吧.
//查找对应的节点
void dev_find_endpoints(libusb_device *dev,int vendorId,int productId) {
libusb_device_descriptor desc;
int r = libusb_get_device_descriptor(dev, &desc);
if (r < 0) {
printf("failed to get device descriptor");
return;
}
printf("Number of possible configurations: %d\n",
(int) desc.bNumConfigurations);
printf("Device Class: %d\n", (int) desc.bDeviceClass);
printf("VendorID:%d \n", desc.idVendor);
printf("ProductID: %d\n", desc.idProduct);
libusb_config_descriptor *config;
libusb_get_config_descriptor(dev, 0, &config);
printf("Interfaces: %", (int) config->bNumInterfaces);
const libusb_interface *inter;
const libusb_interface_descriptor *interdesc;
const libusb_endpoint_descriptor *epdesc;
if(desc.idVendor==vendorId&&desc.idProduct==productId){
dev_list[dev_num].dev=dev;
for (int i = 0; i < (int) config->bNumInterfaces; i++) {
inter = &config->interface[i];
printf("Number of alternate settings: %d\n", inter->num_altsetting);
for (int j = 0; j < inter->num_altsetting; j++) {
interdesc = &inter->altsetting[j];
printf("Interface Number: %d\n", (int) interdesc->bInterfaceNumber);
printf("Interface class: %d\n", (int) interdesc->bInterfaceClass);
printf("Number of endpoints: \n", (int) interdesc->bNumEndpoints);
if(interdesc->bInterfaceClass==LIBUSB_CLASS_PRINTER ){
for (int k = 0; k < (int) interdesc->bNumEndpoints; k++) {
epdesc = &interdesc->endpoint[k];
printf("Descriptor Type:%d \n", (int) epdesc->bDescriptorType);
printf("EP Address: %d\n", (int) epdesc->bEndpointAddress);
int address=epdesc->bEndpointAddress;
if(address>=128){
dev_list[dev_num].in=address;
}else{
dev_list[dev_num].out=address;
}
}
}
}
}
dev_num++;
}
}
ps:代码已经上传到 这里