在 <project>CMake 中隐藏_automoc目标

Hide <project>_automoc targets in CMake

本文关键字:隐藏 automoc 目标 gt lt project CMake      更新时间:2023-10-16

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

但是,命令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" )

用于将条目"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.filter中有一个条目:

Include="C:pathtobuildmyproj_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 ) 

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

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