对自己库函数的未定义引用

undefined reference to own library function

本文关键字:未定义 引用 库函数 自己      更新时间:2023-10-16

我将QT(5)-Creator与两个项目一起使用,这两个项目都使用MinGW在Windows 7下编译我的C++程序。一个项目生成一个静态库,另一个只是用来验证库是否正常。

错误:

在构建库时,不会生成任何错误,并且它成功地创建了静态库MyClassName.a

反过来,当试图导入库时,我在构建/编译过程中收到错误消息:

undefined reference to 'MyClassName::MyClassName()'
undefined reference to 'MyClassName::MyClassFunction()'

文件:

这是我的导入程序项目的main.cpp

#include <QCoreApplication>
#include "MyClassName.h"
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
MyClassName *mainThread = new MyClassName();
mainThread->MyClassFunction();
return a.exec();
}

它是.pro文件

QT       += core
QT       += widgets
QT       -= gui
TARGET = TESTerase
CONFIG   += console
CONFIG   -= app_bundle
CONFIG   +=extserialport
CONFIG   +=staticlib
TEMPLATE = app
HEADERS += 
MyClassName.h
SOURCES += main.cpp    
unix:!macx: LIBS += -L$$PWD/../MyClassName-Release/ -lMyClassName
INCLUDEPATH += $$PWD
INCLUDEPATH += $$PWD/../MyClassName-Release/release
DEPENDPATH += $$PWD/../MyClassName-Release/release
unix:!macx: PRE_TARGETDEPS += $$PWD/../MyClassName-Release/release/MyClassName.a

顺便说一句,我使用了QT Creator的包括外部库功能

我的猜测:

  • 由于我能够在main中[Strg+Click]函数,我认为错误是由链接器抛出的。

  • 这也可能是导入/创建/使用库的一种方式,因为我刚刚开始讨论这个主题。

在互联网上搜索它通常只会得到一个提示,即对两个项目使用相同的编译器-这在我的情况下应该无关紧要(因为我用相同的创建者和相同的设置构建两个项目)。

有人有主意吗?

感谢您对的支持

向致以诚挚的问候

[Bogdans请求的更新]新的.pro文件

#-------------------------------------------------
#
# Project created by QtCreator 2015-04-29T19:46:22
#
#-------------------------------------------------
QT       += core
QT       += widgets
QT       -= gui
TARGET = TESTerase
TEMPLATE = app
CONFIG   += console
CONFIG   -= app_bundle
CONFIG   +=extserialport
HEADERS += 
MyClassName.h
SOURCES += main.cpp
unix:!macx: LIBS += -L$$PWD/../MyClassName-Release/ -lMyClassName

win32:CONFIG(release, debug|release): LIBS += -L$$PWD/../MyClassName-Release/release/ -lMyClassName
else:win32:CONFIG(debug, debug|release): LIBS += -L$$PWD/../MyClassName-Release/debug/ -lMyClassName
else:unix:!macx: LIBS += -L$$PWD/../MyClassName-Release/ -lMyClassName
INCLUDEPATH += $$PWD/../MyClassName-Release/release
DEPENDPATH += $$PWD/../MyClassName-Release/release
win32-g++:CONFIG(release, debug|release): PRE_TARGETDEPS += $$PWD/../MyClassName-Release/release/MyClassName.a
else:win32-g++:CONFIG(debug, debug|release): PRE_TARGETDEPS += $$PWD/../MyClassName-Release/debug/MyClassName.a
else:win32:!win32-g++:CONFIG(release, debug|release): PRE_TARGETDEPS += $$PWD/../MyClassName-Release/release/MyClassName.lib
else:win32:!win32-g++:CONFIG(debug, debug|release): PRE_TARGETDEPS += $$PWD/../MyClassName-Release/debug/MyClassName.lib
else:unix:!macx: PRE_TARGETDEPS += $$PWD/../MyClassName-Release/MyClassName.a

您的.pro文件仅为unix平台unix:!macx:定义库依赖项。我想应该还有适用于Windows的win32

刚才也遇到了同样的问题。Build在macOS/OSX上运行良好,但在具有相同代码库的Windows上运行不佳。

这是因为我没有导出我的符号,这在Windows上是必要的。

在构建库时对函数使用Q_DECL_EXPORT。在使用库中的函数时使用Q_DECL_IMPORT

示例如何在此处执行此操作:https://wiki.qt.io/How_to_create_a_library_with_Qt_and_use_it_in_an_application#Creating_a_shared_library

解决了我的问题,希望有帮助!