在CMake

时间:2016-04-13 08:49:50

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

我正在尝试使用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"到#34;源文件"过滤

我目前正在使用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" )

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

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

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

我错过了什么吗?

感谢您的帮助!

1 个答案:

答案 0 :(得分: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文件夹放在&#34; MyAutoMocFolder&#34;而不是乱丢他们的父文件夹。在Visual Studio中,文件夹中的automoc文件夹也是如此。

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

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