Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/150.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
c++;qt未定义对`\u imp的引用 < >我使用QT创建者制作静态C++库和Qt应用程序。_C++_Qt_Shared Libraries - Fatal编程技术网

c++;qt未定义对`\u imp的引用 < >我使用QT创建者制作静态C++库和Qt应用程序。

c++;qt未定义对`\u imp的引用 < >我使用QT创建者制作静态C++库和Qt应用程序。,c++,qt,shared-libraries,C++,Qt,Shared Libraries,My lib包括MyLib_global.h: #if defined(MYLIB_LIBRARY) # define MYLIBSHARED_EXPORT Q_DECL_EXPORT #else # define MYLIBSHARED_EXPORT Q_DECL_IMPORT #endif myclass.h文件: #include "MyLib_global.h" class MYLIBSHARED_EXPORT MyClass : public QObject { Q_O

My lib包括MyLib_global.h:

#if defined(MYLIB_LIBRARY)
#  define MYLIBSHARED_EXPORT Q_DECL_EXPORT
#else
#  define MYLIBSHARED_EXPORT Q_DECL_IMPORT
#endif
myclass.h文件:

#include "MyLib_global.h"

class MYLIBSHARED_EXPORT MyClass : public QObject
{
    Q_OBJECT
    public:            
        enum Log
        {
            SomeValue,
            NotARealValue
        };
        MyClass(double var, Log e);
        ~MyClass();
}
和myclass.cpp文件:

#include "myclass.h"

MyClass::MyClass(double var, Log e)
{
}
MyClass::~MyClass()
{
}
#include "myclass.h"

void MainWindow::someFunction()
{
    double var = 3.5;
    MyClass::Log enum_value = MyClass::SomeValue;
    MyClass* c = new MyClass(var, enum_value);
}
我在.pro文件中写的这个块:

QT       -= gui
QMAKE_CXXFLAGS += -std=c++0x
TARGET = MyLib
TEMPLATE = lib
CONFIG += staticlib
LIBS += -Ld:/l -lAgemarkerCore
INCLUDEPATH += d:/l/includes
所以我在Windows上使用MingW4.7 32位构建了这个项目。然后,我试图通过在.pro文件中写入以下内容,将库包含在Qt GUI应用程序中:

QT       -= gui
QMAKE_CXXFLAGS += -std=c++0x
TARGET = MyLib
TEMPLATE = lib
CONFIG += staticlib
LIBS += -Ld:/l -lAgemarkerCore
INCLUDEPATH += d:/l/includes
“l”是我的“D:”驱动器上放置“libMyLib.a”文件的文件夹。在“d:/l/includes”文件夹中,我放置了MyLib项目的所有标题

现在,我正在尝试在mainwindow.cpp文件中创建MyClass的新实例:

#include "myclass.h"

MyClass::MyClass(double var, Log e)
{
}
MyClass::~MyClass()
{
}
#include "myclass.h"

void MainWindow::someFunction()
{
    double var = 3.5;
    MyClass::Log enum_value = MyClass::SomeValue;
    MyClass* c = new MyClass(var, enum_value);
}
这是一个问题。在我使用放置在同一房间的同一台计算机、运行在同一系统上的同一个IDE和我与MyLib使用的同一个编译器编译此GUI项目后,我得到以下错误:

mainwindow.cpp:29: error: undefined reference to `_imp___ZN12MyClassC1EPdS0_S0_xiNS_3LogEi'
我搜索了很多论坛,并尝试了一些我找到的解决方案,但他们没有帮助。大多数错误都与GCC编译器有关,简单地更改项目文件和lib的顺序也有帮助,但我只使用一个lib的MinGW,因此没有libs的顺序

如何才能成功链接我的库?

您正在编译一个静态库(
config+=staticlib
),但您正在使用
Q\u DECL\u导出
Q\u DECL\u导入
宏。这些宏仅在编译共享库时使用,因为它们意味着DLL链接(至少在Windows上)

当应用程序试图针对您的静态库进行编译时,它会尝试将其链接为共享库,因为标题指定了DLL链接。这将中断,结果是链接器错误


解决方案是要么构建一个共享库,要么停止导出
MYLIBSHARED\u
(见鬼,它甚至在宏名称中说
shared

我通过在项目的.pro文件中添加
QT+=gui小部件
解决了所有
未定义的“\u imp\u..
引用错误。我使用的是
Qt Creator 4.12.4

主窗口中的第29行是什么。cpp?MyClass*c=新的MyClass(var,enum_值);您确定MyLib_global.h中的预处理器指令正确吗?我认为正确的命令如下:
\ifndef MYLIBSHARED\u EXPORT Q\u DECL\u EXPORT
\define MYLIBSHARED\u EXPORT Q\u DECL\u EXPORT
//实际定义…
\endif
噢,谢谢!这很棘手,现在一切都好了。我不知道为什么这些行是这样写的:自从我在Qt中创建了一个项目以来,我没有改变它们。不客气!很高兴它现在起作用了!它已经被定义了。对不起,我没有在我的问题中指出这一点,我确实认为这无关紧要。答案在对问题的评论中。等等——你创建了一个静态库?我想这就是它不起作用的原因——你不需要在静态库中导出或导入。是的,它是静态的,因为我在.pro文件中编写了
CONFIG+=staticlib
。是的,但是你仍然使用导出/导入宏。这将调用DLL链接,所以库将尝试链接到
\u imp\u
,这是(IIRC)唯一的DLL。@ahawkthomas:为了澄清发生了什么,我更新了我的答案。