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_64CONFIG -= 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 的符号)

C++ 库编程错误:ld:未找到架构 x86_64 的符号

架构 x86_64 / i386 的未定义符号

未找到架构 x86_64 的符号 - Cmake - Mac sierra

错误:未找到架构 x86_64 的符号,collect2:ld 返回 1 退出状态

未找到体系结构 x86_64 的符号