在linux系统 编译libusb

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_21727627/article/details/81870038

在 编译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:代码已经上传到 这里

猜你喜欢

转载自blog.csdn.net/qq_21727627/article/details/81870038