我正在使用遺留代碼,並且遇到一個奇怪的問題。我有可執行文件,它使用名爲dbaccess.so的.so庫。在.so和可執行文件中定義的extern變量做未定義的行爲?
我也有一個名爲「lib_base」的庫,並且這個庫靜態鏈接到兩個項目(dbaccess.so和可執行文件)。
________
|lib_base|
|________|
/ \
/statically \
/ linked \
______/ \ _____________
|my_app| | dbaccess.so |
|______| <---dinamically |_____________|
的問題是,將 「lib_base」 裏面,我有一個.cpp(misc.cpp)文件定義爲
char apName[_MAX_FNAME];
和一個.cpp(clientconn.cpp內的可變)在「dbaccess.so」我有:
extern char apName[_MAX_FNAME];
我注意到代碼中的一些奇怪的行爲。看起來像「extern」變量混淆了my_app的lib_base中的「apName」的定義和dbaccess的lib_base中的定義。
調試時使用gdb一個DBACCESS'功能時,會發生以下情況:
strcpy(apName, "test");
printf(apName);
在控制檯
,‘測試’被打印出來,但如果我寫在gdb的控制檯下面一行的strcpy後:
print apName
它打印「apfile.ini」。
有人知道這個問題是否真的與「lib_base」鏈接到這兩個項目有關?編譯dbaccess.so時是否有任何編譯標誌或某些可以傳遞的內容來避免這種情況?
我使用linux和gcc作爲編譯器。
不應該是相反,頭文件中的'extern ...'_declaration_和源文件中的實際_definition_?否則,變量將在包含標題的所有源文件中定義。 –
對不起,我在編寫問題時犯了一個錯誤。我編輯了問題並修復了它。謝謝! –
您是否需要另一個原因來避免全局變量? –