我遇到了這個問題,并試圖找出最佳解決方案。
我目前正在處理一個名為lib1.h的庫,并對其進行一些修改。我不想直接修改原始檔案,所以我復制了一份檔案并命名為lib2.h。
所有的宣告和定義都在lib1.h和lib2.h,lib1.c和lib2.c中分別編碼。這段代碼看起來是這樣的:
/* lib1.h */
#ifndef LIB1_H
#define LIB1_H
int method1()。
int method2()。
...
#endif>
/* lib2.h */
#ifndef LIB2_H
#define LIB2_H
int method1()。
int method2()。
...
#endif>
/* lib1.c */
#include "lib1.h"
int method1()
{
//舊的實作。
};
int method2()
{
//舊的實作。
};
...
/* lib2.c */。
#include "lib2.h"
int method1()
{
//新的實作。
};
int method2()
{
//新的實作。
};
...
由于我沒有改變所有函式的名稱,我得到了多個定義錯誤。我目前的解決方案是將原始庫移出當前目錄并進行make clean,然后進行編譯。雖然這個解決方案對我來說是可行的,但我只是好奇是否有辦法將兩個頭檔案保持在同一目錄下,或者什么是更好的作業流程。
我希望得到任何指導。
uj5u.com熱心網友回復:
多重定義是一個聯結器錯誤,而不是編譯錯誤。你為什么要鏈接兩個庫?我猜你只需要較新(固定)的那個。 有幾個解決方案:
- 洗掉舊的庫。
- 洗掉舊的代碼,
- 將#ifdef 0放在舊代碼上,或者將它移到單獨的目錄中 。
- 在make檔案中使用-DNEW_CODE標志,在舊庫中使用#ifndef NEW_CODE,在新庫中使用#ifdef NEW_CODE。你可以通過編輯編譯標志在不同版本之間快速切換 。
- 只要不在你的制作檔案中包括舊版本。即使你編譯了它,也不要鏈接它。
- 如果你需要兩個版本的庫(以比較結果?),使用函式的前綴,或作為C 編譯,并將函式包裹在名稱空間中 。
- 使用宏黑客來自動為函式名添加前綴或后綴。真的不推薦這種方法。
- 使用源代碼控制。
- 使用原始碼控制,如git,并在原地更改庫,只保留一個副本。你可以隨時恢復你的提交,以獲得以前的版本 。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/306963.html
標籤:
