在CMake中隐藏<project>_automoc目标

3

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

然而,命令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文件,那么可能会有所帮助。我猜测您使用通配符设置了源代码并在源代码中进行构建,但这也可能完全不正确。 - Slava
我在第一篇帖子中包含了几行代码以重现问题。我没有在源代码中构建,即使我不使用通配符来设置源文件(就像我的示例中一样),_automoc.cpp文件也会被包含进来(无论该文件是否存在)。源文件(“main.cpp”)和CMakeList位于与构建目录不同的目录中。 - Arnaud
呃......奇怪,尝试将project()放到顶部并清除cmake缓存。 - Slava
谢谢您的回答。然而,我已经尝试过(并重新尝试以确保)但它并没有改变任何事情。当我将CMAKE_AUTOMOC设置为ON时,CMake会自动在VS过滤器中创建一个条目,对应于“build \ myproj_automoc.cpp”,过滤器名称为“源文件”。 - Arnaud
2个回答

3

我也曾经遇到过这个问题,按照文档操作并不能起作用。看起来在某个版本中他们修改了变量名。从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 ) 

2
我尝试使用AUTOGEN_TARGETS_FOLDER代替AUTOMOC_FOLDER,但在我的项目中没有起作用,CMake仍会自动将_automoc文件发送到“源文件”Visual Studio筛选器中。目前,我正在使用以下解决方法:source_group(MyAutoMocFolder FILES ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}_automoc.cpp) 这将myproj_automoc文件从“源文件”目录中过滤出来。 - Arnaud
根据您的反馈更新了答案。 - Atif

1

从CMake 3.9开始,您可以使用AUTOGEN_SOURCE_GROUP来过滤MOC文件。

set(CMAKE_AUTOMOC ON)
set_property(GLOBAL PROPERTY AUTOGEN_SOURCE_GROUP "Generated Files")

太好了!谢谢你。你是怎么想到使用set_property的?我一直在苦苦挣扎这份文档很长时间,直到看到你的答案。 - Johnathon
1
@Johnathon CMake文档中的set_property命令说明了如何使用它。用法可以是(GLOBAL PROPERTY ...)(TARGET my_target PROPERTY ...)等。该文档还将重定向到cmake-properties页面,您可以在其中查看全局范围或目标等属性列表。不幸的是,文档缺少一些示例。我主要参考类似的命令并进行修改。 - Burak

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接