使用 GYP 而不是 QMake 使用 MOC 文件进行构建



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

目前,我将脚本作为每次运行的 eclipse 内部的构建规则,但我想通过让 GYP 像 QMake 一样生成一个 makefile 并且已经包含 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/

Q商城主页: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

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

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

我没有在其他操作系统上尝试过,但我认为你可以在其他系统上类似地这样做。让我知道,如果你已经找到了更好的方法。

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

  • 为生成 moc 制定了单独的"目标"
  • 如果该目标只有我们要在其上运行 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
}
]

最新更新