我在Mac上构建了一些Qt项目,目前我正在尝试在Windows上构建相同的代码。在这些项目中,有一个dll(称为LibraryA)导出一个类(称为ClassA),该类由第二个dll(也称为LibraryB)链接。
我有以下代码,根据所使用的编译器定义要使用的dll导出代码。
#ifdef _MSC_VER
#if defined(LIBRARY_A)
#define LIBRARY_A_EXPORT __declspec(dllexport)
#else
#define LIBRARY_A_EXPORT __declspec(dllimport)
#endif
#else
#define LIBRARY_A_EXPORT
#endif
然后,我将其合并到我的类定义中。
class LIBRARY_A_EXPORT ClassA
然而,在Windows上,我在LibraryB中得到了未解析的符号__declspec(dllimport)。
我做错了什么?
EDIT我创建了几个独立的项目来尝试实现这一点(再次称为LibraryA和LibraryB)。LibraryA成功构建,在LibraryB项目中,我使用了"添加库"对话框,选择了外部库。这给了我以下.pro文件条目,这些条目仍然不能正常工作
win32:CONFIG(release, debug|release): LIBS += -L$$PWD/../build-LibraryA-Desktop_Qt_5_5_1_MSVC2013_64bit-Debug/release/ -lLibraryA
else:win32:CONFIG(debug, debug|release): LIBS += -L$$PWD/../build-LibraryA-Desktop_Qt_5_5_1_MSVC2013_64bit-Debug/debug/ -lLibraryA
INCLUDEPATH += $$PWD/../build-LibraryA-Desktop_Qt_5_5_1_MSVC2013_64bit-Debug/debug
DEPENDPATH += $$PWD/../build-LibraryA-Desktop_Qt_5_5_1_MSVC2013_64bit-Debug/debug
我看到了一些可能的场景:
- LibraryA.dll丢失(未生成)。可能不是这样
- LibraryB找不到LibraryA。确保LibraryB"pro"文件中有正确的库路径:
LIBS += -L$$PWD/Path_To_LibraryA_Dll/ -lLibraryA
- LibraryA项目没有定义
LIBRARY_A
宏,LIBRARY_A_EXPORT
也没有定义为__declspec(dllexport)
,在这种情况下,LibraryA不会导出任何内容供外部使用。确保您在LibraryA"pro"文件中有定义:DEFINES += LIBRARY_A
有一个很好的Qt wiki:如何使用Qt创建库并在应用程序中使用它。注意在声明中使用Q_DECL_EXPORT
和Q_DECL_IMPORT
,具体取决于项目,无论它是使用还是提供动态库。