Как скомпилировать заголовочный файл с макросом Q_OBJECT в Xcode?

Я создаю проект C++ в Xcode, который ссылается на структуру Qt. Программа hello world работает хорошо. Когда я добавляю класс, производный от QObject, и добавляю макрос Q_OBJCET, возникает ошибка ссылки.

Класс

МойОбъект.h

#ifndef MyObject_h
#define MyObject_h

#include <QtCore/QObject>

class MyOBject : public QObject
{
  Q_OBJECT

public:
    MyOBject();

};


#endif

МойОбъект.cpp

#include "MyObject.h"

MyOBject::MyOBject()
{
}

Я знаю, что должен использовать moc, чтобы сначала скомпилировать MyObject.h и добавить сгенерированный moc_MyObject.cpp в проект Xcode.

В Microsoft Visual Studio я могу настроить этот заголовочный файл для компиляции с помощью пользовательского инструмента moc. И добавьте сгенерированный файл cpp в проект VS.

Но это Xcode. Мой вопрос: есть ли в Xcode эквивалентное средство для компиляции файла заголовка, включая макрос Q_OBJECT?


person Jeffrey    schedule 07.07.2012    source источник
comment
Не должендолжен. Вы должны запустить moc перед препроцессором и компилятором C++. И весь ваш пост можно сократить до: Как я могу добавить moc в качестве шага сборки в XCode? Предположительно, если у вас возникла эта проблема, вам придется сделать то же самое для uic и rcc.   -  person cmannett85    schedule 07.07.2012


Ответы (2)


Вот как вы это делаете в Xcode 6:

Выберите цель и в правилах сборки создайте новое пользовательское правило. Установите в раскрывающемся списке «Процесс» значение «Исходные файлы с совпадающими именами» и введите *.h рядом с этим. Установите в раскрывающемся списке «Использование» значение «Пользовательский сценарий:» и в сценарии введите что-то близкое к этому:

/path/to/your/Qt/bin/moc ${INPUT_FILE_PATH} -o ${DERIVED_FILE_DIR}/${INPUT_FILE_BASE}_moc.cpp

Вам придется изменить путь туда, где находится ваш исполняемый файл moc. Теперь установите «Выходные файлы» на:

${DERIVED_FILE_DIR}/${INPUT_FILE_BASE}_moc.cpp

Вот и все, что касается пользовательского правила.

Теперь, чтобы заголовки были скомпилированы с этим правилом. Пока ваша цель все еще выбрана, перейдите к «Фазам сборки». Разверните раздел «Компилировать исходники», нажмите кнопку «+» внизу. Найдите и добавьте заголовочные файлы с классами Q_OBJECT в них. Сначала добавьте эти заголовки в свой проект, если вы не можете их там найти.

Вот и все, затем Xcode запустит moc для этих заголовков и поймет, что вывод moc — это .cpp, который необходимо скомпилировать и связать с вашим приложением, и он сделает это за вас.

person James    schedule 30.12.2015
comment
Спасибо. Я трачу много времени, чтобы понять, почему у меня не генерируются файлы moc. В результате я забыл шаг Compile Sources. - person Unick; 24.10.2016

Я не нашел, как установить пользовательский инструмент для определенного файла заголовка в Xcode. Я нашел обходной путь с помощью сценария фазы сборки (Фазы сборки -> Добавить фазу сборки -> Добавить сценарий запуска). Я добавил командную строку moc в качестве скрипта и включил сгенерированный файл moc_MyObject.cpp в MyObject.cpp. Теперь это работает.

person Jeffrey    schedule 09.07.2012