【问题标题】:Linking to SHARED Q_OBJECT: unresolved external symbol "public: static struct QMetaObject const A::staticMetaObject"链接到 SHARED Q_OBJECT:未解析的外部符号“public:static struct QMetaObject const A::staticMetaObject”
【发布时间】:2020-03-27 09:45:16
【问题描述】:

我正在尝试制作两个 QObject 库,在 windows 上使用 cmake,其中一个依赖于另一个。如果我将它们都构建为 STATIC 库,它可以工作,但现在我需要将它们构建为 SHARED 库,我不断收到编译错误。

  • error LNK2001: 无法解析的外部符号“public: static struct QMetaObject const A::staticMetaObject”

我正在使用 Visual Studio 19 进行编译。

有问题的代码的一个小例子:

第一个图书馆:

#include <QObject>
class A: public QObject
{
    Q_OBJECT
public:
    A(const QString& name){}
public Q_SLOTS:
    void ASlot(){}
};

第二个图书馆

#include "A.hpp"
class B: public A {
    Q_OBJECT
public:
    B():A("A"){}
private Q_SLOTS:
    void BSlot(){}
};

CMakeLists.txt:

project(test)
cmake_minimum_required(VERSION 3.10)

set(CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/Modules")

find_package(Qt5Core REQUIRED)
set(CMAKE_AUTOMOC ON)

add_library(A SHARED A.hpp)
target_link_libraries(A ${Qt5Core_LIBRARIES})
set_target_properties(A PROPERTIES WINDOWS_EXPORT_ALL_SYMBOLS TRUE)

add_library(B SHARED B.hpp)
target_link_libraries(B A ${Qt5Core_LIBRARIES})

该代码已经过验证,可以在 linux 上运行,所以我猜这可能是 dll 符号导出方式的问题。我曾尝试使用 qt5_wrap_cpp() 代替 automoc,但结果并没有什么不同。

我希望有人能帮我解决这个问题。

【问题讨论】:

  • 由于库B 使用A,那么您需要链接它们:target_link_libraries(B A)
  • 谢谢我忽略了这一点,但它并没有解决问题
  • @KasperHøjLorenzen 你解决了这个问题吗?我有同样的链接错误,我不知道如何解决它......
  • 我采取了懒惰的方法,只是使用它们静态

标签: c++ windows qt cmake


【解决方案1】:

不知道它是否仍然相关,但我通过关注this official Qt guide for creating shared libraries 解决了这个问题。

在您的情况下,您应该在声明 A 类之前添加以下行:

#if defined(A_EXPORT_SYMBOLS)
#  define A_DLL_EXPORT Q_DECL_EXPORT
#else
#  define A_DLL_EXPORT Q_DECL_IMPORT
#endif

然后通过以下方式声明类A

class A_DLL_EXPORT A: public QObject
{
    Q_OBJECT
public:
    A(const QString& name){}
public Q_SLOTS:
    void ASlot(){}
};

然后,将编译定义添加到cmake配置中的目标A

add_compile_definitions(A PRIVATE A_EXPORT_SYMBOLS)

请注意,定义必须是 PRIVATE 才能在您的 A dll 中拥有 Q_DECL_EXPORT 声明。

B 类也是如此。

【讨论】:

  • 我会在未来几天检查解决方案
猜你喜欢
  • 2022-08-06
  • 1970-01-01
  • 2012-12-19
  • 1970-01-01
  • 2016-08-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-09
相关资源
最近更新 更多