【问题标题】:Qt program does not link, no moc file generatedQt程序不链接,没有生成moc文件
【发布时间】:2012-03-09 17:38:03
【问题描述】:

我正在使用 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,程序会链接,但我不能在运行时使用类插槽。 我注意到没有为 plotter.h 生成 moc 文件。这是我的 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})

为dialog.cpp生成了一个moc文件,而为plotter.cpp却没有,这怎么可能?

谢谢!

【问题讨论】:

  • 您是否尝试过在 plotter.h 文件上手动运行 moc - 只是为了检查是否有未解析的内容,或者是否是 cmake 的错误
  • Qt 有一个很棒的 IDE,你考虑过使用那个 + qmake 吗?
  • 您的文件是如何组织的?您是否在头文件中编写所有代码?如果是这样,您必须在其底部包含 moc_ 文件。
  • @MartinBeckett 感谢您的提示,我做到了,并且似乎生成了正确的输出。
  • @MattPhillips 我以前这样用过,效果很好,不知道我现在做错了什么。

标签: qt cmake moc


【解决方案1】:

首先,确保您正确使用 QT4_AUTOMOC。正如documentation 指出的那样,您仍然需要在源代码中正确包含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 文件看起来还不错。

【讨论】:

  • 感谢提示,QT4_WRAP_CPP 似乎可以处理这两个头文件,但会生成一个 dialog_moc.cxx 文件。无论如何,我现在开始使用 Qt Creator,它工作正常。
  • 使用 Qt5,您必须在 add_executable 之前使用 set(CMAKE_AUTOMOC ON)。反之亦然会导致 OP 的问题。
猜你喜欢
  • 2010-11-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-07
相关资源
最近更新 更多