Попытался откомпилировать программу для проверки баланса
билайн-модема, которая приведена на
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;
}