我寫了一些東西來模擬Windows應用程序的getopt.h庫,其中的一部分是全局變量。當我將程序編譯爲單個應用程序時,此工作正常;然而,當我分離getopt庫並鏈接它時,我的程序開始出現段錯誤。研究這一點,似乎從DLL外部訪問變量不起作用並返回無效指針;有什麼我可以解決這個問題嗎?跨DLL的C++全局變量
編輯:如果我在DLL在調試器中輸入函數,變量是否具有正確的價值 - 直接從應用程序acessing它給出了一個不同的值。
我寫了一些東西來模擬Windows應用程序的getopt.h庫,其中的一部分是全局變量。當我將程序編譯爲單個應用程序時,此工作正常;然而,當我分離getopt庫並鏈接它時,我的程序開始出現段錯誤。研究這一點,似乎從DLL外部訪問變量不起作用並返回無效指針;有什麼我可以解決這個問題嗎?跨DLL的C++全局變量
編輯:如果我在DLL在調試器中輸入函數,變量是否具有正確的價值 - 直接從應用程序acessing它給出了一個不同的值。
什麼是可能發生的是,你還沒有安裝的dllexport/dllimport
正確。結果是你最後得到了同一個變量的不同副本。 (一個dll和一個外)
內DLL,你需要dllexport
編譯的變量暴露給客戶端應用程序。
然後在客戶端應用程序,你需要聲明相同的變量作爲dllimport
。然後它將鏈接到DLL中的鏈接。
這是稍微不幸的,因爲相同的頭文件通常用於DLL和客戶端。所以,平時的工作中,周圍是這樣的:
#ifdef COMPILE_DLL
#define DLL_EXPORT __declspec(dllexport)
#else
#define DLL_EXPORT __declspec(dllimport)
#endif
編輯:
你能確認是否你有相同的變量的兩個副本?嘗試從DLL內部和外部打印出地址。
考慮增加一個功能,您的DLL,它返回變量的值。
是否可以從DLL內部和外部打印出變量的地址。這是要找出你是否有一個或兩個變量的副本。 – Mysticial
另外,變量是如何設置的?它是一個函數返回一個指針,一個外部暴露的指針,只是一個變量......? – ssube
它只是一個外部暴露的指針。 –