[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

ошибка при компиляции



Попытался откомпилировать программу для проверки баланса билайн-модема, которая приведена на http://ru.gentoo-wiki.com/wiki/MF626
запускаю компиляцию:
$ g++ -lusb balans.c -o balans

получаю:

/tmp/cca4sxGE.o: In function `main':
balans.c:(.text+0xb1e): undefined reference to `libiconv_open'
balans.c:(.text+0xb5d): undefined reference to `libiconv'
balans.c:(.text+0xc97): undefined reference to `libiconv_close'
collect2: ld returned 1 exit status

Что нужно поправить в исходном тексте? Текст прилагаю.

И.П.
#include <usb.h>                                                                      
#include <unistd.h>                                                                   
#include <iostream>                                                                   
#include <string.h>                                                                   
#include <errno.h>                                                                    
#include <iconv.h>                                                                    
#include <langinfo.h>                                                                 
#include <locale>                                                                     
#include <string>                                                                     
#include <fstream>                                                                    

using namespace std;

// Ð?оÑ?емÑ? не Ñ?делаÑ?Ñ? Ñ?ак:
//
//int SendToDevice( char* bi, int len, usb_dev_handle *udev)
//{                                                           
//    int rc;                                                  
//    rc = usb_bulk_write(udev, 2, bi, len, 200);                
//                                                            
//    if (rc < 0) {
//        rc=0;                                           
//        cout<<endl<<rc<<":"<<strerror(errno)<<endl;
//    } else cout<<"in :"<<bi<<" len: "<<rc<<endl; //cout<<rc<<endl;
//    return rc;
//}                                                                                                                
// вÑ?зÑ?ваÑ?Ñ? Ñ?ак:
// len=SendToDevice(initcom1, sizeof(initcom1)-1, udev);
// Ð? вообÑ?е C++ здеÑ?Ñ? излиÑ?еÑ?Ñ?во, можно обойÑ?иÑ?Ñ? ANSI C и даже chat(8) script.

void SendToDevice( char* bi, int &len, usb_dev_handle *udev)
{                                                           
    int t;                                                  
    t=usb_bulk_write(udev, 2, bi, len, 200);                
                                                            
    if(t<0)len=0;                                           
    else len=t;                                             
    if (t<0) cout<<endl<<t<<":"<<strerror(errno)<<endl;else cout<<"in :"<<bi<<" len: "<<t<<endl; //cout<<t<<endl;
}                                                                                                                


int main(void)
{             
    struct usb_bus *bus=NULL;
    struct usb_device *dev=NULL;
    usb_dev_handle *udev=NULL;  
                                
    char com[]="AT+CUSD=1,*102#,15\r\n";
    char initcom0[]="AT+ZOPERTE=\"beeline\"\r\n";
    char initcom1[]="AT+ZOPRT=5\r\n";            
    char initcom2[]="AT+ZSTART\r\n";             
    char initcom3[]="AT+CPBS=\"SM\"\r\n";        
    char initcom4[]="AT+CPMS=\"SM\",\"SM\",\"\"\r\n";
    //char ans[512]={0};                             
    char buf[512]={0};                               
    int lenc,lenc1,len,i,j=0,t;                      
    fstream port;                                    
    string ans;                                      
                                                     
                                                     
    usb_init();                                      
    usb_find_busses();                               
    usb_find_devices();                              
                                                     
    //find device and open handle                    
    for (bus = usb_busses; bus; bus = bus->next)     
        for (dev = bus->devices; dev; dev = dev->next)
            if( (dev->descriptor.idVendor==6610) &&  ( dev->descriptor.idProduct==49) )
            {                                                                          
                udev = usb_open(dev);                                                  
            }                                                                          
                                                                                       
    if(udev==0)return -1;                                                              
                                                                                       
    usb_claim_interface(udev, 1);                                                      
    usb_set_altinterface(udev, 1);                                                     
    usb_resetep(udev, 2);                                                              
                                                                                       
    lenc=0;while(com[lenc]!=0)lenc++;                                                  
                                                                                       
    lenc1=0;while(initcom0[lenc1]!=0)lenc1++;len=lenc1;                                
    SendToDevice(initcom0, len, udev);                                                 
    lenc1=0;while(initcom1[lenc1]!=0)lenc1++;len=lenc1;                                
    SendToDevice(initcom1, len, udev);                                                 
    sleep(5);                                                                          
    lenc1=0;while(initcom0[lenc1]!=0)lenc1++;len=lenc1;                                
    SendToDevice(initcom0, len, udev);                                                 
    lenc1=0;while(initcom2[lenc1]!=0)lenc1++;len=lenc1;                                
    SendToDevice(initcom2, len, udev);                                                 
    lenc1=0;while(initcom3[lenc1]!=0)lenc1++;len=lenc1;                                
    SendToDevice(initcom3, len, udev);                                                 
    lenc1=0;while(initcom4[lenc1]!=0)lenc1++;len=lenc1;                                
    SendToDevice(initcom4, len, udev);                                                 
    sleep(10);                                                                         


    len=lenc;                                                                          
    SendToDevice(com, len, udev);                                                      
    if (len!=lenc)                                                                     
    {                                                                                  
        if(udev)usb_close(udev);                                                       
        return -1;                                                                     
    }                                                                                  
                                                                                       
    sleep(5);                                                                          
                                                                                       
    port.open("/dev/ttyUSB0", fstream::in | fstream::app);                             
                                                                                       
    port>>ans;                                                                         
    cout<<"ans: "<<ans<<endl;                                                          
                                                                                       
    while( ans[0]!='0' || ans[1]!=',' || ans[2]!='\"')                                 
    {                                                                                  
        port>>ans;                                                                     
        cout<<"ans: "<<ans<<endl;                                                      
    }                                                                                  
                                                                                       
    port.close();                                                                      
                                                                                       
    for(i=3,j=0;ans[i]!='\"' && i<512;i+=2,j++)                                        
    {                                                                                  
        switch(ans[i+1])                                                               
        {                                                                              
            case 'A':                                                                  
            case 'a': buf[j]=10;break;                                                 
                                                                                       
            case 'B':                                                                  
            case 'b': buf[j]=11;break;                                                 
                                                                                       
            case 'C':                                                                  
            case 'c': buf[j]=12;break;                                                 
                                                                                       
            case 'D':                                                                  
            case 'd': buf[j]=13;break;                                                 
                                                                                       
            case 'E':                                                                  
            case 'e': buf[j]=14;break;                                                 
                                                                                       
            case 'F':                                                                  
            case 'f': buf[j]=15;break;                                                 
                                                                                       
            default : buf[j]=((int)ans[i+1]-48);                                       
        };                                                                             
        switch(ans[i])                                                                 
        {                                                                              
            case 'A':                                                                  
            case 'a': buf[j]+=10<<4;break;                                             
                                                                                       
            case 'B':                                                                  
            case 'b': buf[j]+=11<<4;break;                                             

            case 'C':
            case 'c': buf[j]+=12<<4;break;

            case 'D':
            case 'd': buf[j]+=13<<4;break;

            case 'E':
            case 'e': buf[j]+=14<<4;break;

            case 'F':
            case 'f': buf[j]+=15<<4;break;

            default : buf[j]+=((int)ans[i]-48)<<4;
        };
    }

    std::locale::global(std::locale(""));


    cout<<" i: "<<i<<" j: "<<j<<endl;


    char *lang;
    iconv_t cd;
    char fromcode[]="UCS-2BE";
    char *instr = buf;
    char outs[512]={0};
    char *outstr = (char *) outs;
    size_t in=0,out=512,res;


    lang=nl_langinfo(CODESET);
    cout<<endl<<" local: "<<lang<<endl;

    cd = iconv_open(lang,fromcode);

    in=j;
    res=iconv(cd, &instr, &in, &outstr, &out );

    if (res = ((size_t) -1) ) cout<<endl<<"РезÑ?лÑ?Ñ?аÑ?: "<<strerror(errno)<<endl;
    cout<<endl<<" in: "<<in<<" out: "<<512-out<<" answer : "<<outs<<endl;

    cout<<endl;


    iconv_close(cd);
    if(udev)usb_close(udev);

    return 0;
}

Reply to: