Программа Qt не связывается, не генерируется moc-файл - PullRequest
2 голосов
/ 09 марта 2012

Я использую Qt, CMake и компилятор VS2010.Кажется, есть проблема, когда я связываю небольшой кусочек тестового кода.Компоновщики выдают следующую ошибку:

plotter.cpp.obj : error LNK2001: unresolved external symbol "public: virtual str
uct QMetaObject const * __thiscall Plotter::metaObject(void)const " (?metaObject
@Plotter@@UBEPBUQMetaObject@@XZ)...

(она продолжается некоторое время)

Ошибка возникает, когда я пытаюсь наследовать от QObject в следующем коде:

class Plotter : public QObject
{
        Q_OBJECT
public:

Если я опускаю Q_OBJECT, программа связывается, но я не могу использовать слоты классов во время выполнения.Я заметил, что moc-файл не создается для plotter.h.Это мой CMakeLists.txt:

 cmake_minimum_required (VERSION 2.6)
    project (ms)

    SET(CMAKE_BUILD_TYPE "Release")

    FIND_PACKAGE(Qt4)
    INCLUDE(${QT_USE_FILE})
    ADD_DEFINITIONS(${QT_DEFINITIONS})

    LINK_LIBRARIES(
        ${QT_LIBRARIES}
    )

    set(all_SOURCES plotter.cpp main.cpp dialog.cpp)
    QT4_AUTOMOC(${all_SOURCES})
    add_executable(ms ${all_SOURCES})
    target_link_libraries(ms ${LINK_LIBRARIES})

Файл moc создается для dialog.cpp, но не для plotter.cpp, как это возможно?

Спасибо!

1 Ответ

1 голос
/ 10 марта 2012

Прежде всего, убедитесь, что вы правильно используете QT4_AUTOMOC.Как указывает документация , вам все равно нужно правильно включить mocced файлы в ваши источники.

Также обратите внимание, что QT4_AUTOMOC все еще помечен как экспериментальный CMake, так что убедитесь, что он действительно делает то, чтовы ожидаете и правильно генерируете нужные файлы.Если нет, подумайте о переходе на более надежное классическое решение с использованием QT4_WRAP_CPP:

# notice that you need to pass the *header* here, not the source file
QT4_WRAP_CPP(MY_MOCED_FILES plotter.hpp)

# optional: hide the moced files in their own source group
# this is only useful if using an ide that supports it
SOURCE_GROUP(moc FILES ${MY_MOCED_FILES})

# then include the moced files into the build
add_executable(ms ${all_SOURCES} ${MY_MOCED_FILES})

Кроме того, ваш файл CMake выглядит нормально.

...