对自己的库函数的未定义引用 我使用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中的函数,所以我假设错误是由链接器引发的
- 这也可能是导入/创建/使用库的一种方式,因为我刚刚开始讨论这个主题
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