我正在尝试使用最初为Windows编写的Qt C ++项目,并将其交叉编译为嵌入式Linux。现在这个程序在Windows上编译查找和工作,所以这个问题必须是特定于操作系统的东西(我认为不会发生Qt代码)或配置相关,但我很难跟踪它,因为我没有完全理解C ++语法。
我的make命令:
arm-linux-gnueabihf-g ++ -c -march = armv7-a -marm -mthumb-interwork -mfloat-abi = hard -mfpu = neon -mtune = cortex-a8 -O2 -O3 -Wall -W -D_REENTRANT -DCHL80Net -DPHASE_TO_NEUTRAL -DCHL80NET -DCANLCD_BUILD -DQT_NO_DEBUG -DQT_XML_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DQT_SHARED -I ../ mkspecs / qws / linux-am335x-g ++ -I。 -I ../include / QtCore -I ../include/QtGui -I ../include/QtXml -I ../ include -I。 -IApp -IApp / Model / ModelSim -IApp / Model -I。 -IPages -IApp / GUI / Widgets -IApp / GUI / Pages -IApp / GUI -IApp / GUI / Widgets -IApp / GUI / Pages / Util -IApp / GUI / Pages -IApp / Log4Qt -I.obj -o .obj /CanInterface.o App / Can / CanInterface.cpp
错误:
App / Can / CanInterface.cpp:在成员函数'void中 CanInterface :: closeConnection()':App / Can / CanInterface.cpp:68:5: 错误:':: close'尚未声明为make: * [.obj / CanInterface.o]
错误1
以下是有问题的代码行:
void CanInterface::closeConnection()
{
::close(m_socket);
m_socket = -1;
我认为这开始看起来并不像有效的代码,但我真的不懂C ++所以我不得不做一些研究,似乎这个::function()
语法是为了确保解决问题从全局命名空间而不是本地命名空间。
所以我想知道的是命名空间应该声明这个close()
函数。如果我对这段代码的理解是正确的,我不需要在CanInterface
类中查找未声明的函数,但它是父类?
在CanInterface
类的头文件中,我发现了这个:
class CanInterface : public QObject
{
Q_OBJECT
我认为意味着它来自QObject
类的inharents。所以:
QObject
类以查找缺失的close()
函数,或者我是否需要继续运行? ::close
以某种方式告诉我需要搜索多少层嵌套类?答案 0 :(得分:4)
你是对的,因为::some_function()
从全局范围调用一个函数。
这包括所有C
库或系统功能。您可以使用man
在* nix系统上查找全局函数,例如
man close
在我的Ubuntu上提供
NAME
close - close a file descriptor
SYNOPSIS
#include <unistd.h>
int close(int fd);
因此,要修复编译错误,必须在C ++源代码或周围的头文件中包含unistd.h
。
当你谷歌搜索man close时,你可以获得相同的信息。 http://linux.die.net/man/2/close
答案 1 :(得分:3)
C ++封装名称空间中的名称以避免命名冲突。这有点类似于C实践,即将特定于库的前缀添加到该库中的函数名称,例如,C中的my_library_foo()
可能在C ++中被称为my_library::foo()
。当::
出现在名称的开头时,意味着名称完全限定:从全局命名空间开始查找它,而不是当前/封闭的命名空间,就像绝对名称一样(/etc/passwd/
)与相对(foo/bar
)文件名。
因此名称::close
旨在解析为全局命名空间中声明的close函数,即将<unistd.h>
包含在POSIX系统中的那个函数。