Qt5“未找到架构 x86_64 的符号”
Posted
技术标签:
【中文标题】Qt5“未找到架构 x86_64 的符号”【英文标题】:Qt5 "symbol(s) not found for architecture x86_64" 【发布时间】:2013-07-17 13:13:56 【问题描述】:首先,我知道还有其他帖子在谈论这个错误,但我认为我的有点不同。
我有一个带有这个 pro 文件的 Qt 项目:
QT += core
QT += network
QT -= gui
TARGET = QDownloaderCLI
CONFIG += console
CONFIG -= app_bundle
TEMPLATE ...
我尝试了CONFIG -= X86_64
,但没有任何改变。
在网上搜索我发现了一些奇怪的东西,我有一个带有公共槽的 .h 文件,他的实现在 .cpp 文件中:
public slots:
void stateChanged(int state);
有了这个,我收到了错误消息,但如果我在 .h 和 .cpp 中评论 void stateChanged(int state);
就可以了。
我该如何解决这个问题?
我也有警告:
directory not found for option '-F/Applications/Qt//5.1.0/clang_64/qtbase/lib'
和
"This version of OS X is unsupported" [-W#warnings]
我也尝试过“运行 qMake”,但我也收到了警告:
No .qmake.cache is present. This significantly slows down qmake with this makespec.
Call 'cache()' in the top-level project file to rectify this problem.
我使用的是带有 Qt 5.1.0 的 Mac OS X 10.8.4
我的 .h 文件的代码:
#ifndef DOWNLOADER_H
#define DOWNLOADER_H
#include <QObject>
#include <QDebug>
#include <QFile>
// In Qt 5 no more QHttp
#include <QNetworkAccessManager>
class downloader : public QObject
Q_OBJECT
public:
explicit downloader(QObject *parent = 0);
void doDownload();
signals:
public slots:
void stateChanged(int state);
private:
QNetworkAccessManager *http;
;
#endif // DOWNLOADER_H
【问题讨论】:
您在 stateChanged 函数中使用了任何第三方库吗? 这个问题似乎是题外话,因为它是关于一个简单的语法错误 @AndrewBarber 问题不在于语法错误。让 OS X 上的 Qt 项目的链接/编译标志正确并非易事。这是我在尝试在 OS X 上构建复杂的 Qt 项目时搜索此特定错误时发现的第一个结果。 【参考方案1】:您需要提供编译输出以便我们为您提供帮助,目前您只向我们提供了问题输出中的警告。
当我在 OSX 上遇到参考错误时,我通常会收到此错误。 即当我在我的 .h 文件中声明了一个函数然后没有声明它时。
您是否测试过将 stateChanged 函数移动为公共而不是插槽?
当您尝试通过右键单击 .cpp 文件中的函数并选择光标下的跟随符号来跟随该函数时会发生什么。
如果 .cpp 和 .h 文件之间的连接错误,您将在此处收到错误消息。 也可以尝试在.h文件中声明函数进行测试。
您收到的警告是您经常收到的警告,它不应使应用程序无法运行。我每次运行应用程序时都会得到它。
请提供编译输出。
问候 /RK
【讨论】:
当我将它声明为公共而不是公共插槽时,它会编译。我得到的唯一错误消息是 avertissement:找不到选项“-F/Applications/Qt//5.1.0/clang_64/qtbase/lib”的目录。并且右键单击 .cpp 中的函数什么也不做。 你编译的输出应该看起来像这样09:15:54: Starting: "C:\Qt\5.0.2\Tools\MinGW\bin\mingw32-make.exe" C:/Qt/5.0.2/Tools/MinGW/bin/mingw32-make -f Makefile.Debug\5.0.2\5.0.2\mingw47_32\include\QtWidgets" -I"C:\Qt\5.0.2\5.0.2\mingw47
,你有没有尝试创建一个类似的函数并将其用作公共插槽?
完美,这是一个参考错误。我在我的 Mac 上做了一些测试,我注意到当在 .cpp 中没有定义该函数而它被声明为公共函数时,你似乎没有收到错误。当您将其移入公共插槽时,您会收到错误消息。您可以粘贴您在 .cpp 文件中声明的函数 stateChanged 吗?
我的函数代码:void stateChanged(int state) //Code here
尝试添加下载器:: 之前像这样void downloader::stateChanged(int state) //Code here
【参考方案2】:
未找到的路径对吗?在我的Makefile
中,我有:
LIBS = $(SUBLIBS) -F/Users/enrico/Qt5.0.1/5.0.1/clang_64/lib -framework QtWidgets -F/Users/enrico/Qt5.0.1/5.0.1/clang_64/qtbase/lib -framework QtGui -framework QtCore -framework OpenGL -framework AGL
void stateChanged(int state);
的错误信息是什么?
【讨论】:
对于void stateChanged(int state);
,这里是错误消息:Warning: directory not found for option '-F/Applications/Qt//5.1.0/clang_64/qtbase/lib' Error symbol(s) not found for architecture x86_64
没有其他链接器输出?请在Compile Output
中发布您所拥有的内容。你试过CONFIG += x86_64
和CONFIG -= i386
吗?
我已经在我的第一条评论中发布了编译输出并且 CONFIG += x86_64 with CONFIG -= i386 没有改变任何东西
您是否尝试过重命名您的函数(将其用作公共插槽)?
如果我将名称更改为公共插槽,则无法编译。【参考方案3】:
您的 .h 文件应在链接阶段之前编译为 *.moc。如果您未找到的符号是 stateChanged 那是您缺少的步骤。当您进入链接阶段时,没有找到 QObject 插槽作为符号并且您的链接器停止处理。
或者它可能缺少一些 QT 密钥/宏来正确声明为 QObject。
详情请关注Qt5 help for moc
【讨论】:
以上是关于Qt5“未找到架构 x86_64 的符号”的主要内容,如果未能解决你的问题,请参考以下文章
AFNetworking 错误 - AFHTTPRequestOperationManager(未找到架构 x86_64 的符号)
未找到架构 x86_64 的符号 - Cmake - Mac sierra