2013-08-06 4 views
0

я кросс компиляции пакета (libqmi). (С простой компиляции, это было прекрасно.)чтения не было объявлено сообщение об ошибке

Проблема возникла, когда я пытался выполнить C++ часть. Я получил сообщение

"read is not declared".

Я знаю, что он не должен быть включен в случае C, но как насчет C++?

Я попытался добавить заголовки вручную: fcntl.h и unistd.h тоже, без какого-либо решения. (компилятор нашел их и включил, но сообщение об ошибке все еще осталось)

Вы хоть представляете, что проблема может быть за этим? Я не думаю, что проблема неправильная, так как она реализована и хороша с компилятором хоста.

EDIT: благодарит за комментарии. хост: Linux, x86, цель: Linux, рука

unistd.h заголовок не решил проблему: Я также попытался типа Alloc, может быть, есть misalloc. GobiQMICore.cpp: В функции-члене 'virtual std :: vector, std :: basic_string>> cGobiQMICore :: GetAvailableDevices()': GobiQMICore.cpp: 319: 39: ошибка: «чтение» не было объявлено в этой области GobiQMICore.cpp: 334: 21: ошибка: 'закрыть' не был объявлен в этой области

код:

/*=========================================================================== 
METHOD: 
    GetAvailableQDLPorts (Public Method) 

DESCRIPTION: 
    Return the set of available Gobi QDL ports 

RETURN VALUE: 
    std::vector <sDeviceID> 
===========================================================================*/ 
std::vector <std::string> cGobiQDLCore::GetAvailableQDLPorts() 
{ 
    std::vector <std::string> devices; 

    std::string path = "/sys/bus/usb/devices/"; 

    std::vector <std::string> files; 
    DepthSearch(path, 
       2, 
       "ttyUSB", 
       files); 

    int fileNum = files.size(); 
    for (int i = 0; i < fileNum; i++) 
    { 
     // Example "/sys/bus/usb/devices/8-1/8-1:1.1/ttyUSB0" 
     std::string nodePath = files[i]; 

     int lastSlash = nodePath.find_last_of("/"); 

     // This is what we want to return if everything else matches 
     std::string deviceNode = nodePath.substr(lastSlash + 1); 

     // Move down one directory to the interface level 
     std::string curPath = nodePath.substr(0, lastSlash); 

     // Read bInterfaceNumber 
     int handle = open((curPath + "/bInterfaceNumber").c_str(), 
         O_RDONLY); 
     if (handle == -1) 
     { 
     continue; 
     } 

     char buff[4]; 
     memset(buff, 0, 4); 

     bool bFound = false; 
     int ret = read(handle, buff, 2); 
     if (ret == 2) 
     { 
     // Interface 1 or 0 
     ret = strncmp(buff, "01", 2); 
     if (ret == 0) 
     { 
      bFound = true; 
     } 
     ret = strncmp(buff, "00", 2); 
     if (ret == 0) 
     { 
      bFound = true; 
     } 

     } 
     close(handle); 

     if (bFound == false) 
     { 
     continue; 
     } 

     // Move down one directory to the device level 
     curPath = curPath.substr(0, curPath.find_last_of("/")); 

     // Read idVendor 
     handle = open((curPath + "/idVendor").c_str(), O_RDONLY); 
     if (handle == -1) 
     { 
     continue; 
     } 
     bFound = false; 
     ret = read(handle, buff, 4); 
     if (ret == 4) 
     { 
     ret = strncmp(buff, "05c6", 4); 
     if (ret == 0) 
     { 
      bFound = true; 
     } 
     } 
     close(handle); 

     if (bFound == false) 
     { 
     continue; 
     } 

     // Read idProduct 
     handle = open((curPath + "/idProduct").c_str(), O_RDONLY); 
     if (handle == -1) 
     { 
     continue; 
     } 
     bFound = false; 
     ret = read(handle, buff, 4); 
     if (ret == 4) 
     { 
     ret = strncmp(buff, "920c", 4); 
     if (ret == 0) 
     { 
      bFound = true; 
     } 
     } 
     close(handle); 

     if (bFound == false) 
     { 
     continue; 
     } 

     // Success! 
     devices.push_back(deviceNode); 
    } 

    return devices; 
} 

T

+0

Какова ваша цель в кросс-компиляции? Я предполагаю, что Linux - это хост? –

+0

Ваша проблема должна быть решена с включением 'unistd.h'. Как вы говорите, вы включили уже так, просто убедитесь, что вы включили это для требуемого и правильного' c' файла. –

+3

Показать код с помощью этого 'read()' в нем! –

ответ

2

I know it does not need to be included in case of C, but what about C++?

Я думаю, что вы должны всегда включают заголовки, которые вам нужны. Я думаю, ваш компилятор выполняет эту работу за вас, если вы используете параметр «-Wall» с gcc, вы должны получить предупреждение.

Под Linux, чтобы узнать, какой заголовок вам нужно включить, просто введите man function. Когда-нибудь вы можете получить справочную страницу bash, для открытия вам нужно указать раздел man 2 read, и в кратком обзоре у вас есть требуемые заголовки. Чтобы получить эти справочные страницы, вам также нужно установить manpages-dev в дистрибутив Debian.

Чтобы ответить на ваш вопрос, у меня также возникла такая проблема, когда я писал программы на C++, используя пространство имен. Если вы находитесь внутри пространства имен, попробуйте вызвать эту функцию следующим образом: ::read(...)

+0

спасибо да, я тоже думал, что.но мне действительно интересно, почему я не получаю никаких ошибок, если я использую мой компилятор хоста. I простой тип ./configure и сделать без каких-либо параметров, и нет ошибки. и в случае перекрестного компилятора я получаю вышеуказанные вещи. Я боюсь манипулировать кодом, который может привести нас к плохому поведению позже (это код сторонней стороны, и у меня нет времени, чтобы понять так много, что я мог бы отредактировать), или, может быть, есть серьезная ошибка конфигурации, которая может вызвать другие проблемы позже. – Tomi

Смежные вопросы