2013-12-12 41 views
1

已解決。當我添加我的圖書館作爲一個正常的內部庫一切都很好。我沒有做的是在命名空間中定義的一些免費函數上使用MY_LIBRARY_EXPORT宏。不知何故,我以這種方式操作庫導入,以使這些函數正常工作,但是按照此處所述的其他方式破壞了它。在Qt Creator中與mingw共享庫給出未定義的參考錯誤

我還沒有能夠使用Qt Creator嚮導使用共享庫。我嘗試過使用動態鏈接,但失敗了,不能用作靜態庫。在這兩種情況下,我都會收到一個'undefined reference to'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環境引起的,還是我一般不瞭解共享庫。

+0

您提供的信息是不夠的,請至少提供一個最小和可建立的問題的例子。 – George

+1

確切的錯誤信息也會有幫助。 – George

回答

2

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

小例子:

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

'未定義的引用' 鏈接錯誤:

>gcc test.c 
cczICEqq.o:test.c:(.text+0x1e): undefined refer ence to `[email protected]' 
collect2.exe: error: ld returned 1 exit status 

在這種情況下,你就必須像這樣指定libwsock32.a:

gcc test.c -lwsock32 

而且請注意,libsomething.a並不是唯一可以解析引用的地方。您可能錯過了一個目標文件。

不幸的是,沒有更多的細節,我無法告訴你確切的問題。

0

您可能忘記了導出您的符號,如here on MSDN所述以及本網站上的各種問題。這是一種普遍的痛苦,有幾種方法可以解決這個問題,沒有比其他方法好得多的方法。

這使得DLL和導入庫實際上包含對您編譯到其中的符號的引用。您可以將其與GCC的符號可見性進行部分比較,儘管這隻適用於Linux,並且GCC也支持MSDN for Windows中描述的內容。