本文将要讨论的内容实际上包含2个问题:
1. 工程中包含静态库A,动态库B,可执行程序C。C依赖于A和B,而B依赖于A。在A中定义有全局变量X(或类的静态成员变量),则在动态库B中访问的X,与可执行程序C中访问的X是同一个变量还是两个不同的变量?
答案:是两个不同的变量。
测试代码如下:
//A中定义变量g_nValue(A.cpp): int g_nValue = 0; //B代码 (B.cpp): extern int g_nValue; BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ) { return TRUE; } void SetValue(int value) { g_nValue = value; } //C代码 (TestDlgDlg.cpp): extern void SetValue(int); extern int g_nValue; void CTestDlgDlg::OnButton1() { CString strMessage; SetValue(23); strMessage.Format("g_nValue=%d\n", g_nValue); AfxMessageBox(strMessage); }
//A中定义变量g_nValue(A.cpp): __declspec(dllexport) int g_nValue = 0; //B代码 (B.cpp): __declspec(dllimport) int g_nValue; BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ) { return TRUE; } void SetValue(int value) { g_nValue = value; } //C代码 (TestDlgDlg.cpp): extern void SetValue(int); __declspec(dllimport) int g_nValue; void CTestDlgDlg::OnButton1() { CString strMessage; SetValue(23); strMessage.Format("g_nValue=%d\n", g_nValue); AfxMessageBox(strMessage); }
本测试源码我已经上传了,有兴趣的可以在csdn下载:
http://download.csdn.net/detail/guggy/4711045