QtCreator中带有mingw的共享库给出了未定义的引用错误
shared library in Qt Creator with mingw gives undefined reference error
已解决。当我将我的库添加为普通的内部库时,一切都很好。我失败的是在命名空间中定义的一些自由函数上使用MY_LIBRARY_EXPORT宏。不知怎的,我以这样一种方式操纵了库导入以使这些函数工作,但它以其他方式崩溃了,正如这里所描述的。
我无法使用Qt Creator向导使用共享库。我尝试过动态链接,但都失败了,也不能用作静态库。在这两种情况下,我都会得到一个"对'IMP_*'的未定义引用"错误。
这是我的专业档案。它们都在同一SUB_DIR父项目中,并且路径正确。
库专业文件的相关部分:
TARGET = Prospec
TEMPLATE = lib
CONFIG += staticlib
QMAKE_CXXFLAGS += -std=c++11
DEFINES += PROSPEC_LIBRARY
整个user.pro文件。(ProspecTest是Prospec的一个单元测试项目)。
#-------------------------------------------------
#
# Project created by QtCreator 2013-12-12T15:04:30
#
#-------------------------------------------------
QT += testlib
QT -= gui
TARGET = prospectest
CONFIG += console
CONFIG -= app_bundle
TEMPLATE = app
QMAKE_CXXFLAGS += -std=c++11
SOURCES += prospectest.cpp
mltest.cpp
convertertest.cpp
numericitemtest.cpp
DEFINES += SRCDIR=\"$$PWD/\"
HEADERS +=
utilities.h
mltest.h
convertertest.h
numericitemtest.h
win32:CONFIG(release, debug|release): LIBS += -L$$PWD/../Prospec/release/ -lProspec
else:win32:CONFIG(debug, debug|release): LIBS += -L$$PWD/../Prospec/debug/ -lProspec
INCLUDEPATH += $$PWD/../Prospec/debug
DEPENDPATH += $$PWD/../Prospec/debug
win32:CONFIG(release, debug|release): PRE_TARGETDEPS += $$PWD/../Prospec/release/libProspec.a
else:win32:CONFIG(debug, debug|release): PRE_TARGETDEPS += $$PWD/../Prospec/debug/libProspec.a
# Boost
INCLUDEPATH += C:/boost/boost_1_55_0/
LIBS += "-LC:/boost/boost_1_55_0/stage/lib/"
EDIT:未定义的引用错误只发生在我调用源文件中的功能的地方。例如,如果我构造了一个库对象,我会得到错误,但如果我将该对象构造函数移到头文件中,那么编译就可以了。现在我不确定这个问题是由于Qt环境造成的,还是我不了解共享库。
您描述的错误指向链接器错误。当没有指定必要的对象/lib文件时,就会发生这种情况。最有可能的情况是:包含一个标头并使用该标头中的函数,但不指定该函数是在哪个库中定义的。
小示例:
//test.c
#include <winsock.h>
int main() { gethostbyname("localhost"); }
"未定义引用"链接器错误:
>gcc test.c
cczICEqq.o:test.c:(.text+0x1e): undefined refer ence to `gethostbyname@4'
collect2.exe: error: ld returned 1 exit status
在这种情况下,您必须指定libwsock32.a,如下所示:
gcc test.c -lwsock32
另外,请注意,libsomething.a并不是唯一可以解析引用的地方。您可能错过了一个对象文件。
不幸的是,如果没有更多的细节,我无法告诉你确切的问题。
您可能忘记导出符号,如MSDN上的此处和本网站上的各种问题中所述。总的来说,这是一种痛苦,有几种方法可以解决这个问题,没有比另一种更好的了。
这使得DLL和导入库实际上包含对您编译到其中的符号的引用。您可以将其部分与GCC的符号可见性进行比较,尽管这只适用于Linux,而且GCC也支持MSDN for Windows上描述的内容。
刚才也遇到了同样的问题。Build在macOS/OSX上运行良好,但在具有相同代码库的Windows上运行不佳。感谢鲁本布,他为我指明了正确的方向。这里的完整解决方案,如何为Qt:做
在构建库时对函数使用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
解决了我的问题,希望有帮助!
- 如何修复此错误:未定义对"距离(浮点数,浮点数,浮点数,浮点数,浮点数)"的引用
- 我的项目不会像"undefined reference to `grpc::g_core_codegen_interface'"那样使用未定义的引用错误进行编译
- 对C宏的未定义引用,但在定义它时会出现重新定义错误
- 尝试调用 .h 文件中定义的变量时出现变量未定义错误
- 在C++中使用内联方法时出现未定义的符号错误
- 尝试运行 wasm 函数时出现模块未定义错误
- c++中数组的未定义错误
- 基类未定义.错误 C2504
- 获取线函数未定义错误。无法在字符串中保存可验证的内容
- 对于我的 ComplexNumber 中的某些方法,我得到了一个奇怪的未定义错误引用.cpp,不过我对模板很陌生
- 类类型重定义和基类未定义错误
- C 中的基类未定义错误
- QML[未定义]错误
- 如何构建使用 OpenCV 的 XCode 6 iOS 应用程序 - 未定义错误__cplusplus
- 变量未定义错误
- 静态方法声明但未定义错误c++
- c++ cocos-2d-x未定义错误
- 基类未定义错误(C2504)
- 单例作为模板,未定义错误
- Solaris库与STLport4.6.2链接,出现与ostream相关的未定义错误