【发布时间】: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 你解决了这个问题吗?我有同样的链接错误,我不知道如何解决它......
-
我采取了懒惰的方法,只是使用它们静态