如何解决此错误消息:“未声明读取”?

问题描述 投票:0回答:1

我正在交叉编译一个包(

libqmi
)。简单编译一下就可以了。

当我尝试遵守 C++ 部分时,问题出现了。我收到此错误消息:

未声明读取

我知道在 C 中不需要包含它,但是 C++ 呢?

我也尝试手动添加标题:

fcntl.h
unistd.h
,但没有任何解决方案。编译器找到了它们,但错误信息仍然存在。

您知道这背后的问题是什么吗?

我不认为这个问题是错误的,因为它是通过主机编译器实现的并且很好。


编辑:

感谢您的评论。

主机:Linux,x86
目标:Linux、arm

unistd.h
标题并不能解决问题。

我也尝试过类型alloc,也许有误分配。

GobiQMICore.cpp: In member function 'virtual std::vector<std::pair<std::basic_string<char>, std::basic_string<char> > > cGobiQMICore::GetAvailableDevices()':
GobiQMICore.cpp:319:39: error: 'read' was not declared in this scope
GobiQMICore.cpp:334:21: error: 'close' was not declared in this scope

代码:

/*===========================================================================
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;
}
c++ c linux compiler-errors
1个回答
2
投票

我知道在 C 中不需要包含它,但是 C++ 呢?

我认为您应该始终包含您需要的标题。我猜你的编译器正在为你做这项工作,如果你在 gcc 中使用“-Wall”参数,你应该会收到警告。

在 Linux 下,要知道需要包含哪些标头,只需键入

man function
。有时您可能会看到 bash 手册页,要打开,您需要指示
man 2 read
部分,并且在概要中,您有所需的标题。要获取这些手册页,您还需要在基于 Debian 的发行版上安装 manpages-dev。

回答你的问题,我在使用命名空间编写C++程序时也遇到过这样的问题。如果您位于命名空间内,请尝试像这样调用此函数

::read(...)

© www.soinside.com 2019 - 2024. All rights reserved.