Search code examples
c++ubuntulibusb

Compiler error libusb


I am running Ubuntu 12.04 and using c++ I have the following code

#include <iostream>
#include <libusb-1.0/libusb.h>

using namespace std;

int main(){
    //pointer to pointer of device used to retrieve a list of devices
    libusb_device **devs;
    libusb_device_handle *dev_handle; //a device handle
    libusb_context *ctx = NULL; //A LIBUSB session
    int r;// for return values
    ssize_t cnt; //holding number of devices in list
    r = libusb_init(&ctx); // initialize the library for the session we just declared

    if(r < 0){
        cout <<"init error "<<r<< endl;
        return 1;
    }

    libusb_set_debug(ctx, 3); // set verbosity level to 3, as suggested in the documentation
    cnt = libusb_get_device_list(ctx, &devs); //get the list of devices

    if (cnt < 0) {
        cout <<"Get Device Error "<< endl; // there was an error
        return 1;
    }

    cout << cnt <<" Device in list " << endl;
    dev_handle = libusb_open_device_with_vid_pid(ctx, 0951, 1689); // these are vendor id and product id

    if (dev_handle == null){
        cout <<"Cannot open device "<< endl;
    }else{
        cout << "Device opened" << endl;
    }

    libusb_free_device_list(devs, 1);// free the list unref the devices in it

    unsigned char *data = new unsigned char[4];//data to write
    data[0] = 'a'; data[1] = 'b'; data[2] = 'c'; data[3] = 'd';//some dummy values

    int actual; //used to find how many bytes were written

    if (libusb_kernal_driver_active(dev_handle, 0) == 1){// findout if kernal driver attached
        cout << "Kernal Driver Active" << endl;
        if (libus_detach_kernal_driver(dev_handle, 0) == 0 ){   //detach it
            cout<< "Kernal Driver Detached" << endl;
        }
    }

    r = libusb_claim_interface(dev_handle, 0);// claim interface 0 (the first) of devices

    if(r < 0){
        cout <<"Cannot claim interface "<<endl;
        return 1;
    }

    cout <<"Claimed interface "<<endl;

    cout<<"data->"<<data<<"<-"<<endl; // just to see the data we want to write : abcd
    cout<<"Writing data..."<<endl;

    r = libusb_bulk_transfer(dev_handle, (2 | LIBUSB_ENDPOINT_OUT), data, 4, &actual, 0);//my device's out endpoint was 2, found withe trial - the device had two endpoints: 2 and 129

    if(r == 0 && actual == 4){  // we wrote 4 bytes successfully
        cout<<"Writing successfull"<<endl;
    }else{
        cout<<"write error"<<endl;
    }

    r = libusb_release_interface(dev_handle, 0); // release the claimed interface

    if (r != 0){
        cout << "Cannot release interface" << endl;
        retrun 1;
    }
    cout<<"Released interface"<<endl;
    libusb_close(dev_handle); // close the device we opened
    libusb_exit(ctx); // need to be called to end the

    delete[] data;// delete the allocated memory for data
    return 0;
    //printf("Hello libusb!");
    //return 0;
}

I tried following three commands to compile the above code

g++ transfer_data_libusb.cpp $(pkg-config --libs libusb-1.0) -o transfer_data_libusb
g++ transfer_data_libusb.cpp -o transfer_data_libusb
g++ transfer_data_libusb.cpp

but I get the following errors

transfer_data_libusb.cpp: In function ‘int main()’:
transfer_data_libusb.cpp:32:20: error: ‘null’ was not declared in this scope
transfer_data_libusb.cpp:45:47: error: ‘libusb_kernal_driver_active’ was not declared in this scope
transfer_data_libusb.cpp:47:47: error: ‘libus_detach_kernal_driver’ was not declared in this scope

I am having a difficult time understanding these errors and would like some advice on a solution if possible,

thanks


Solution

  • You getting errors because this variables and functions (symbols) were not declared nor in your main program, nor in the library (header files) that you used. You've probably just misspelled their names.

    • You should have "NULL" instead of "null"
    • You should have ‘libusb_kernel_driver_active’ instead of ‘libusb_kernal_driver_active’
    • You should have ‘libus_detach_kernel_driver’ instead of ‘libus_detach_kernal_driver’

    Just fix that and everything should be OK.