对自己的库函数的未定义引用 我使用QT(5)-C造造术,有2个项目,它们都是在Windows 7下用MinGW的C++程序编译的。一个项目生成一个静态库,另一个项目只是验证库是否正常

对自己的库函数的未定义引用 我使用QT(5)-C造造术,有2个项目,它们都是在Windows 7下用MinGW的C++程序编译的。一个项目生成一个静态库,另一个项目只是验证库是否正常,c++,qt,gcc,mingw,static-libraries,C++,Qt,Gcc,Mingw,Static Libraries,错误: 构建库时不会生成任何错误,并且它成功创建了静态库MyClassName.a 反过来,在尝试导入库时,我会在构建/编译过程中收到错误消息: undefined reference to 'MyClassName::MyClassName()' undefined reference to 'MyClassName::MyClassFunction()' 文件: 这是我的导入程序项目的main.cpp 顺便说一句,我使用了QtCreator的include外部库函数 我的猜测: 因为我能

错误:

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

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

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

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

顺便说一句,我使用了QtCreator的include外部库函数

我的猜测:

  • 因为我能够[Strg+单击]main中的函数,所以我假设错误是由链接器引发的

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

无论如何,在互联网上搜索它通常只会得到一个提示,对两个项目使用相同的编译器——这在我的情况下并不重要(因为我使用相同的创建者和相同的设置构建两个项目)

有人有主意吗

谢谢你的支持

问候

[更新Bogdans请求] 新的.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
#-------------------------------------------------
#
# 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。

刚才也有同样的问题。构建在macOS/OSX上运行良好,但在具有相同代码库的Windows上运行不正常

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

在构建库时,对函数使用
Q\u DECL\u EXPORT
。 使用库中的函数时,请使用
Q_DECL\u IMPORT

示例如何在此处执行此操作:


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

我换了Linux+Windows。错误消息消失了,但现在出现了这样的
:-1:错误:没有规则使“debug\TESTerase.exe”需要目标“/MyClassName Release/debug/MyClassName.a”。停止。
@user3085931显示新的.pro文件。@user3085931您添加了未定义的预生成依赖项。我假设您已经构建了
libMyClassName.a
,因此仅添加
win32:LIBS+=-L$$PWD/。/MyClassName Release/-lMyClassName'
如果排除最后5行,我会得到错误消息
找不到-lMyClassName
错误:ld返回1个退出状态
。顺便说一句,我再次使用了Qt-lLibrary iImport向导。@user3085931您确定生成了
libMyClassName.a
?名称和
lib
前缀在这里很重要。
#-------------------------------------------------
#
# 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