2011-09-20 77 views
2

我寫了一些東西來模擬Windows應用程序的getopt.h庫,其中的一部分是全局變量。當我將程序編譯爲單個應用程序時,此工作正常;然而,當我分離getopt庫並鏈接它時,我的程序開始出現段錯誤。研究這一點,似乎從DLL外部訪問變量不起作用並返回無效指針;有什麼我可以解決這個問題嗎?跨DLL的C++全局變量

編輯:如果我在DLL在調試器中輸入函數,變量是否具有正確的價值 - 直接從應用程序acessing它給出了一個不同的值。

+0

是否可以從DLL內部和外部打印出變量的地址。這是要找出你是否有一個或兩個變量的副本。 – Mysticial

+0

另外,變量是如何設置的?它是一個函數返回一個指針,一個外部暴露的指針,只是一個變量......? – ssube

+0

它只是一個外部暴露的指針。 –

回答

4

什麼是可能發生的是,你還沒有安裝的dllexport/dllimport正確。結果是你最後得到了同一個變量的不同副本。 (一個dll和一個外)

內DLL,你需要dllexport編譯的變量暴露給客戶端應用程序。

然後在客戶端應用程序,你需要聲明相同的變量作爲dllimport。然後它將鏈接到DLL中的鏈接。

這是稍微不幸的,因爲相同的頭文件通常用於DLL和客戶端。所以,平時的工作中,周圍是這樣的:

#ifdef COMPILE_DLL 
#define DLL_EXPORT __declspec(dllexport) 
#else 
#define DLL_EXPORT __declspec(dllimport) 
#endif 

編輯:

你能確認是否你有相同的變量的兩個副本?嘗試從DLL內部和外部打印出地址。

+0

DLL導入/導出將無助於從DLL獲取無效指針。它們控制外部可見的符號,它們實際上並不改變變量本身。 – ssube

+0

@peachykeen:你怎麼知道問題不在於有不同的副本,因爲它沒有正確設置?指針正在DLL中正確寫入,但客戶端應用程序(無意)讀取它自己的(無效)副本,因爲它們沒有合併(當它們應該是)。 – Mysticial

+0

這是可能的,這取決於變量類型以及事情的設置方式。我會刪除我的投票,但我認爲一些OP澄清會有所幫助。 *編輯:*似乎我不能刪除,除非你編輯答案。 – ssube

3

考慮增加一個功能,您的DLL,它返回變量的值。