3
假設我有這樣的模板類:模板類與整個使用靜態數據成員DLL/SO
template <class T>
class Queue
{
public:
static int Size;
};
template <class T> int Queue<T>::Size = 0;
我導出D.dll函數使用隊列作爲一個參數:
void ChangeQueueSize(Queue<int>& q)
{
q.Size = 100;
}
然後我使用該出口在A.exe時功能:
Queue<int> q;
q.Size = 10;
ChangeQueueSize(q);
int updatedSize = q.Size;
由於隊列類是從類模板在2工程中的生成ts,實際上有2個代碼副本,以及靜態數據成員。
所以調用ChangeQueueSize在這裏不會真的改變隊列的大小,它只是更新另一個類的靜態成員,它恰好具有相同的類名。
我們可以做些什麼來解決這個問題?
gcc中的弱符號能夠解決這個問題嗎?
非常感謝。
謝謝,我可以使用declspec(dllexport)/ declspec(dllimport)以及您的方式來「導出」隊列因此DLL和客戶端共享代碼。你有沒有關於如何在Linux中實現這個想法,似乎沒有這樣的機制。 –
你不需要Linux上的'declspec'。只要讓它成爲一個在Linux上什麼都不做的平臺條件宏。 –
我還沒有嘗試過,但是然後,SO和可執行文件將有自己的隊列副本,你真的認爲它工作正常嗎? –