Visual Studio 2008 中的 Qt4 - moc-ed 文件从构建中排除?

Posted

技术标签:

【中文标题】Visual Studio 2008 中的 Qt4 - moc-ed 文件从构建中排除?【英文标题】:Qt4 in Visual Studio 2008 - moc-ed files get excluded from build? 【发布时间】:2009-07-29 13:28:09 【问题描述】:

最近我从 Qt Software 安装了 VS Addin,并将我的 .pro 项目导入到 VS2008。 一般来说,一切正常,只有一个小但烦人的例外。

假设我有一个 file.cpp,其中有一个声明它是 Q_OBJECT 的类。 因此,该文件是 MOC-ed 并生成 moc_file.cpp,并且在“生成的文件”下的解决方案中可用。到目前为止一切顺利。

有趣的是,当我更改 file.cpp 中的某些内容(例如,添加一行)并使用 Ctrl+S 保存文件时,moc_file.cpp 将被排除在构建之外(您可以看到一个禁止输入符号图标上)。当我按 F7 构建解决方案时,我遇到了很多典型的链接器错误。为了解决这种情况,我需要转到 moc_file.cpp 的属性并将“从构建中排除”从“是”更改为“否”。然后一切正常。

其他人也有同样的经历吗?我做错了吗?

【问题讨论】:

你有最新的VS Addin吗?您的项目是否被 VS 视为“Qt 项目”? 【参考方案1】:

问题解决了。我发现在描述我的项目的手工制作的 .pro 文件中,我将 MOC_DIR 指定为:

MOC_DIR = .moc

在导入到 Visual Studio 目录后,“生成的文件”对于发布和调试都是相同的。因此,例如,当我的活动配置是 Debug 时,当我保存一个文件时,它被排除在构建之外,因为它对于与发布相关的文件是明智的 - 正如 rpg 和 Andrew 建议的那样。 将目录更改为 .moc\$(ConfigurationName) 后,问题不再出现(我在解决方案中看到每个生成文件的 2 个版本 - 每个配置一个)。

感谢大家的帮助!

【讨论】:

我在 VS 2008 中导入 .pro 时遇到了同样的问题,实际上,一些“生成的”文件夹缺少 $(ConfigurationName) 部分。 P.S:你应该接受你自己的答案,这样这个问题就不会出现在未回答的部分。 ;-) 增加了投票数,因为我遇到了同样的问题,这似乎是一针见血。【参考方案2】:

实际上,我已经找到了该“功能”的解决方案。您必须从 GeneratedFiles\Debug 和 GeneratedFiles\Debug (或从其他配置目录)添加两个文件。 Qt 将从构建中排除不属于当前选定构建类型的所有内容。

【讨论】:

【参考方案3】:

是的,我使用最新的 VS Addin,我的项目被正确地视为 Qt 项目。

【讨论】:

【参考方案4】:

您是否正确设置了配置?

打开“调试配置设置”窗口 如下所述设置以下项目:

“构建命令行”qmake -project & qmake & nmake 调试 “清理命令”nmake debug-clean “重建命令行”qmake & nmake 调试

对发布配置重复同样的操作

【讨论】:

【参考方案5】:

我在 VS2008(VS 2003 也是)中看到了被排除在构建之外的行为,但项目构建正确。当你改变一个 moc'able 文件时,Qt 将不得不重新创建 moc'ed 文件,因为它已经过时了。

我怀疑Qt的算法是这样的:

检测文件已更改 将旧的 moc 文件设置为从构建中排除 在项目中添加一个同名的新文件并将其包含在构建中

查看我的 VS 2003 项目,我可以看到一些 moc_* 文件在项目中包含两次,一个版本设置为从构建中排除,另一个版本不设置。

【讨论】:

【参考方案6】:

使用 qmake 重新创建 .vsproj 文件可能会解决此问题。

对于您拥有的每个 QObject 文件,QT 插件会为每个构建配置(通常只是调试和发布)创建一个 moc_ 文件。当您更改当前配置时,您会看到禁止进入的标志从一个文件转到另一个文件。 当您更改 .cpp 文件时, moc_ 文件不应更改。仅当您更改 .h 文件时。所有这些都使我认为您的配置发生了问题,而修复它的最佳方法是使用 qmake 重新创建它,如下所示:

qmake -spec win32-msvc2008

【讨论】:

以上是关于Visual Studio 2008 中的 Qt4 - moc-ed 文件从构建中排除?的主要内容,如果未能解决你的问题,请参考以下文章

Visual Studio 2008 中的输出

怎样在visual studio 2008中的c#控制台中用console.writeline语句输出一个字符数组?用foreach循环怎么写

Qt 4.8,Visual Studio 2013 编译错误

Visual Studio 2008 中的 .NET 2.0 安装项目

Visual Studio 2008 中的文件特定编译选项

Visual Studio 2008/10 的即时窗口中的“搜索内存”是不是损坏?