我正在交叉编译一个包(
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++ 呢?
我认为您应该始终包含您需要的标题。我猜你的编译器正在为你做这项工作,如果你在 gcc 中使用“-Wall”参数,你应该会收到警告。
在 Linux 下,要知道需要包含哪些标头,只需键入
man function
。有时您可能会看到 bash 手册页,要打开,您需要指示 man 2 read
部分,并且在概要中,您有所需的标题。要获取这些手册页,您还需要在基于 Debian 的发行版上安装 manpages-dev。
回答你的问题,我在使用命名空间编写C++程序时也遇到过这样的问题。如果您位于命名空间内,请尝试像这样调用此函数
::read(...)