c++ - 在 CMake 中隐藏 <project>_automoc 目标

标签 c++ xcode visual-studio-2015 cmake qt5

我正在尝试使用 CMAKE_AUTOMOC 属性自动查找和编译可移动文件。

但是,命令 set( CMAKE_AUTOMOC ON ) 还在 Visual Studio“源文件”过滤器中包含生成的 _automoc.cpp 文件。这是一个问题,原因有两个:

  • 即使以前没有使用过,它也会创建过滤器,因此会污染 VS 资源管理器。
  • 它在其他源文件中间添加了一个不应手动修改到解决方案的附加文件。

我想知道是否可以:

1) 阻止 CMake 将此文件包含到 Visual Studio 过滤器中。我搜索并找到了https://cmake.org/Bug/print_bug_page.php?bug_id=13788 . 然而使用

SET_PROPERTY(GLOBAL PROPERTY USE_FOLDERS ON)
SET_PROPERTY(GLOBAL PROPERTY AUTOMOC_FOLDER automoc)

没有改变我的问题。

2) 使用 CMake 从 .vcxproj.filters 文件中删除给定的条目,使用类似于

的命令
source_group( "Source Files" FILES "filepath" )

用于将条目“文件路径”添加到“源文件”过滤器。

我目前正在使用 CMake 3.5、VS 2015 和 Qt 5.6。这是重现问题的 CMake 的缩短版本:

project( myproj )

# Some stuff to include Qt libraries
# ...

set( CMAKE_AUTOMOC ON )

# These 2 lines don't change anything
SET_PROPERTY(GLOBAL PROPERTY USE_FOLDERS ON)
SET_PROPERTY(GLOBAL PROPERTY AUTOMOC_FOLDER automoc)

# Create project
add_executable( ${PROJECT_NAME} "main.cpp" )

在名为“源文件”的 VS 过滤器中,我可以看到 main.cpp 和 myproj_automoc.cpp,它们在第一次编译之前甚至不存在(尝试用 VS 打开它会发送错误“无法打开文件”) .在 myproj.vcxproj.filters 中有一个条目:

Include="C:\pathto\build\myproj_automoc.cpp">
<Filter>Source Files</Filter>

这不应该在这里,因为我没有要求它。

我错过了什么吗?

感谢您的帮助!

最佳答案

我也遇到了麻烦,无法按照记录的那样工作。看起来他们在其中一个版本中重命名了变量。从 Cmake 3.0.2 开始,您可以执行以下操作:

cmake_minimum_required(VERSION 3.0.2)
project(MyProj CXX)
set_property(GLOBAL PROPERTY USE_FOLDERS ON)
set_property(GLOBAL PROPERTY AUTOGEN_TARGETS_FOLDER MyAutoMocFolder)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)
set(CMAKE_AUTOUIC ON)
add_executable(${PROJECT_NAME}
    ${MyProj_HEADERS}
    ${MyProj_SRCS}
    ${MyProj_QRC}
    ${MyProj_UI})

请注意,您必须使用 set_property 并且属性名称现在为 AUTOGEN_TARGETS_FOLDER。

在 Xcode 中,这会将生成的 _automoc 文件夹放在“MyAutoMocFolder”中,而不是将它们乱扔在父文件夹中。在 Visual Studio 文件夹中的 automoc 文件夹也是如此。

但是它不会隐藏生成的 project_automoc.cpp 文件。要移动它们,您必须定义一个源组,正如 Armand 指出的那样:

source_group( MyAutoMocFolder FILES ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}_automoc.cpp ) 

关于c++ - 在 CMake 中隐藏 <project>_automoc 目标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36593180/

相关文章:

c# - 在 C# 或 C++ 中读取二进制文件

xcode - 显示后调整 NSPopover 的大小

ios - 除非选择为目标,否则框架中的 Xcode 警告不会显示在项目导航器中

c++ - "std::endl"与 "\n"

c++ - 什么时候在 C++ 中调用模板类的静态成员的构造函数?

.net - Nuget System.Data.SqlClient 破坏了我的项目

c++ - Visual Studio 2015 中的返回值优化?

c++ - Win32 应用程序不在启动时运行

c++ - std::thread::join是否保证写入可见性

ios - Xcode 10 如何使用带有 obfuscator-llvm 插件的新构建系统