2017-09-22 58 views
2

我想測試一些針對某些私有qt類的代碼。 (我很清楚,這不是一個公共的API,甚至可以在小版本中改變,並且這會破壞二進制兼容性)Qt私有API無法解析的外部符號

我唯一做的訪問私有頭文件是添加QT + = network-私人在.pro。

但它似乎不夠。

當我包括

#include <QtNetwork/private/qnetworkreplyhttpimpl_p.h> 

我嘗試實例化一個QNetworkReplyHttpImpl對象收到以下解析外部符號

ssonetworkmanager.obj:-1: error: LNK2019: unresolved external symbol "public: __cdecl QNetworkReplyHttpImpl::QNetworkReplyHttpImpl(class QNetworkAccessManager * const,class QNetworkRequest const &,enum QNetworkAccessManager::Operation &,class QIODevice *)" ([email protected]@[email protected]@@[email protected]@[email protected]@[email protected]@@Z) referenced in function "public: class QNetworkReply * __cdecl SsoNetworkManager::get(class QNetworkRequest const &)" ([email protected]@@[email protected]@[email protected]@@Z)

有人不知道如何編譯的東西,依賴於私有API?除了QT + = 什麼-private在.pro文件?

+3

我最近有類似的問題,可能是相關的:https://bugreports.qt.io/browse/QTBUG-62948 – dtech

回答

2

我目前沒有在我面前的Qt源代碼,所以這是一個「瘋狂的猜測」而不是真正的答案。

在windows下爲了在編譯的.dll中可見,需要在庫中標記符號__declspec(dllexport),在使用項目中標記__declspec(dllimport)。如果不是這種情況,鏈接器找不到符號,因爲它從未被導出,或者它不知道它應該在庫中查找(取決於哪一個丟失)。

對於Linux,導出是默認的,但有一些方法可以將符號標記爲私有。

根據你的操作系統/編譯器和Qt源代碼,要麼你必須修改頭文件(添加導入/導出或刪除私有文件),或者還需要編譯項目中的源文件(當然還有所有頭文件/他們依賴的源文件)。
可能還有一個「默認導出」(Win)或「忽略私有」(Linux)的編譯器標誌,但您必須查看編譯器的文檔。

+0

謝謝你的答案,其實我在Windows上使用QT。所以要回顧一下:QT + = *不管用什麼* -private來訪問私有頭文件。符號(來自公共和私有API)都包含在通用模塊DLL中,特別是在這種情況下,包含在Qt5Network.dll中。但要查看私有的可能需要使用__declspec()重新編譯DLL,我會嘗試讓你知道是否一切正常! – Jiloc

+0

這將是我的猜測。如果Qt提供了一種簡單的方式來訪問頭文件,我還希望能夠簡單地爲所有私有類設置__declspec(),也許有一些宏定義? – Anedar

+2

的確如此。請參閱https://github.com/qt/qtbase/blob/5.9/src/network/access/qnetworkreplyhttpimpl_p.h#L81。這個類和它的方法都不會被導出,因此它不能在windows上工作。 – Felix