OSX下奇怪的Qt包含目录结构

Posted

技术标签:

【中文标题】OSX下奇怪的Qt包含目录结构【英文标题】:Strange Qt include dir structure under OSX 【发布时间】:2016-05-28 10:08:13 【问题描述】:

我正在试验 Qt 头文件(用于 vim 的 clang-complete 插件)。 为此,我正在尝试编译一个简单的 qt 函数(注意:这不应该工作,只是试图编译它)。

#include <QWidget>
int main(int, char**) 
  QWidget* a;

我用编译

clang try.cpp -o try -DQT_GUI_LIB -DQT_WIDGETS_LIB -isystem/Applications/Qt/5.6/clang_64/lib/QtCore.framework/Headers -isystem/Applications/Qt/5.6/clang_64/./mkspecs/macx-clang -isystem/Applications/Qt/5.6/clang_64/lib/QtGui.framework/Headers -isystem/Applications/Qt/5.6/clang_64/lib/QtWidgets.framework/Headers

并得到错误

In file included from /Applications/Qt/5.6/clang_64/lib/QtWidgets.framework/Headers/QWidget:1:
/Applications/Qt/5.6/clang_64/lib/QtWidgets.framework/Headers/qwidget.h:37:10: fatal error: 
  'QtGui/qwindowdefs.h' file not found
#include <QtGui/qwindowdefs.h>

这是因为 QWidgets 标头包含 #include &lt;QtGui/...&gt;。例如,在 Linux 安装中这是可以的,因为文件夹是按该顺序设置的。但在 OSX 中,文件夹具有不同的结构。每个模块的标头都在 Qt&lt;Module&gt;.framework/Headers/... 内,而不是 Qt&lt;Module&gt;/

如果来自 Qt 的 .h 显然不适合这个文件夹结构,我该怎么告诉编译器包含在哪里,使用这个文件夹结构?

【问题讨论】:

您尝试设置路径吗? @SibiCoder 路径到哪里?问题是它找不到QtGui/qwindowdefs.h,因为它在 Qt 文件夹中的结构不是这样 【参考方案1】:

如-manatttta 所示,Qmake 规范“macx-clang”不公开标题文件夹,例如&lt;QtCore/*.h&gt;,与 Unix 和 Windows 配置一样,因为它使用 Xcode 框架架构:例如&lt;QtCore.framework/*.h&gt;

您可以创建一个别名(符号链接),将 QtCore.framework/headers 映射到 QtCore。请务必删除任何现有的 Qt 生成的 Makefile(s),以便后续构建将使用适当的包含路径生成。 以下是一些配置示例:

cd <MyApp>/include

mkdir -p MacOSX/Qt/headers

cd MacOSX/Qt/headers

QT_CORE_HEADERS=<your Qt path up to verson subdirectory>/clang_64/lib/QtCore.framework/Versions/5/Headers

ln -s  $QT_CORE_HEADERS QtCore

Delete existing Makefile `rm -f <MyApp>/Build/Makefile`

【讨论】:

以上是关于OSX下奇怪的Qt包含目录结构的主要内容,如果未能解决你的问题,请参考以下文章

Mac OSX 系统目录结构(转)

解密Qt安装目录的结构

Qt QML包含来自不同目录的问题

作为 OS X 捆绑资源添加到 Qt 项目目录的内容

Qt无法打开包含文件:'QNetworkAccessManager':没有这样的文件或目录

不区分大小写的OSX文件系统 - 奇怪的更改目录(cd)bash行为