3

通过从 QMake 中删除 moc 生成步骤,我不再需要依赖 QtCreator。目前,我正在使用自定义脚本来生成/更新 Qt moc 文件,然后再通过 Eclipse 中的 GYP 生成 makefile。有谁知道如何将 moc 作为构建规则添加到 GYP,以便我可以巩固这一步?

目前,我将脚本作为每次运行的 Eclipse 内部的构建规则,但我想通过让 GYP 生成一个 makefile 来避免这种方法,该文件已经像 QMake 那样在其中包含 moc 规则。

感兴趣的链接:

参考使用 GYP 开发 Qt: https ://groups.google.com/group/gyp-developer/browse_thread/thread/42cfb9902b86d715/b17701d9a6805671?show_docid=b17701d9a6805671

GYP 主页: http ://code.google.com/p/gyp/

QMake 主页:http: //qt-project.org/doc/qt-4.8/qmake-manual.html

我当前的 moc 脚本:

#!/bin/bash
MOC="/path/to/Qt/4.8.1/gcc/bin/moc"
SRC_DIR="/path/to/project"

$MOC $SRC_DIR/SkDebuggerUI.h -o $SRC_DIR/moc_SkDebuggerUI.cpp
$MOC $SRC_DIR/SkQtWidget.h -o $SRC_DIR/moc_SkQtWidget.cpp
4

2 回答 2

1

我有完全相同的问题。我没有在 moc 脚本中包含单独的步骤,而是在我的 .gyp 文件中添加了以下几行。

'conditions': [
    ['OS=="linux"': {
        'sources': [
            'your other source code files',
            '<!(moc numerickeypad.h -o moc_numerickeypad.cpp && echo moc_numerickeypad.cpp)',
        ],
    }],
],

我没有在其他操作系统上尝试过,但我认为您可以在其他系统上进行类似的操作。让我知道,如果你有更好的方法。

于 2016-01-27T17:12:09.573 回答
0

我刚刚经历了这个,虽然它并不完美,但它是可行的。我做了以下事情:

  • 为生成 mocs 制作了一个单独的“目标”
  • 如果该目标只有我们想要运行 moc 的 .h 文件作为“源”
  • 将生成的 .cpp 文件公开为 direct_dependent_settings,因此它们的源代码在依赖目标中编译
  • 构建一个“规则”以在“源”列表中的每个头文件上运行 moc。
  • 让我的可执行文件依赖于那个目标

它看起来像这样:

'targets':
[
{
    'target_name': 'editor_generate_mocs',
    'type': 'none',
    'sources': 
        [
            'src/editorwindow.h',
        ],

    'direct_dependent_settings':
        {
            'sources':
            [
                '<(SHARED_INTERMEDIATE_DIR)/editorwindow_moc.cpp',
            ]
        },
    'rules':
        [
            {
                'rule_name': 'generate_qt_mocs_rule',
                'extension': '.h',
                'msvs_cygwin_shell' : 0, # Don't run cygwin set_env to run a command.
                'inputs':
                    [
                        '>(qt_dir)/bin/moc.exe',
                    ],
                'outputs':
                    [
                        '<(SHARED_INTERMEDIATE_DIR)/<(RULE_INPUT_ROOT)_moc.cpp',
                    ],
                'action':
                    [
                        '>(qt_dir)/bin/moc.exe',
                        '--compiler-flavor', 'msvc',
                        '<(RULE_INPUT_PATH)',
                        '-o', '<(SHARED_INTERMEDIATE_DIR)/<(RULE_INPUT_ROOT)_moc.cpp'
                    ],
                'message': '<(SHARED_INTERMEDIATE_DIR)/<(RULE_INPUT_ROOT)_moc.cpp'
            }
        ]
    },
# ..., rest of my targets
}
]
于 2018-02-25T00:46:38.097 回答