[英]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.