簡體   English   中英

Qt Creator中的共享庫與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

整個用戶.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/"

編輯:未定義的引用錯誤只發生在我調用源文件中的功能的地方。 例如,如果我構造一個庫對象,我得到錯誤,但如果我將該對象構造函數移動到頭文件中,那么編譯就可以了。 現在我不確定問題是由Qt環境引起的,還是我不了解共享庫。

您描述的錯誤指向鏈接器錯誤。 當未指定必需的對象/ lib文件時,會發生這種情況。 最可能的情況是:您包含標頭並使用該標頭中的函數,但不指定在哪個庫中定義該函數。

小例子:

//test.c
#include <winsock.h>
int main() { gethostbyname("localhost"); }

'undefined reference'鏈接器錯誤:

>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上運行不正常。 感謝rubenvb ,他指出了我正確的方向。 這里是完整的解決方案,如何為Qt做到這一點:

在構建lib時,在函數上使用Q_DECL_EXPORT 使用lib中的函數時使用Q_DECL_IMPORT

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

解決了我的問題,希望它有所幫助!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM