假設我將庫分配爲二進制文件。它有兩個版本,調試和發佈。調試和發佈互不兼容,所以如果例如用戶構建一個發佈可執行文件,他/她必須鏈接到發佈庫。確保相同的配置用於庫和可執行文件
如果庫和可執行版本之間存在不匹配,那麼當前會出現很難找出的細微錯誤。我反而希望顯示一個非常明確的錯誤消息,告訴它存在不匹配,最好在鏈接時。
什麼是實現這個目標的好方法?
假設我將庫分配爲二進制文件。它有兩個版本,調試和發佈。調試和發佈互不兼容,所以如果例如用戶構建一個發佈可執行文件,他/她必須鏈接到發佈庫。確保相同的配置用於庫和可執行文件
如果庫和可執行版本之間存在不匹配,那麼當前會出現很難找出的細微錯誤。我反而希望顯示一個非常明確的錯誤消息,告訴它存在不匹配,最好在鏈接時。
什麼是實現這個目標的好方法?
我會假設你正在使用一個靜態庫和二進制你的意思是,這將在編譯時被鏈接的的.lib (而不是在運行時可能不匹配的DLL等)。
在我看來,最簡單的方法是在圖書館的cpp文件有這類的構建體在您的.h文件中
#ifdef _RELEASE //or whatever your compiler uses
#define InitialiseLibrary InitialiseLibraryRelease
#else
#define InitialiseLibrary InitialiseLibraryDebug
#endif
同理:
#ifdef _RELEASE //or whatever your compiler uses
void InitialiseLibraryRelease()
{
CommonInitialise();
}
#else
void InitialiseLibraryDebug()
{
CommonInitialise();
}
#endif
主現在exe使用庫:
InitialiseLibrary();
如果庫和exe文件的版本不匹配,那麼鏈接呃會報告不匹配一個或其他InitialiseLibrary ...函數。
另一種方法是確保發佈和調試庫編譯爲不同名稱的文件,然後使用.p文件中的#pragma(而不是將項目庫明確包含在項目中)工作。 如上所述使用#ifdef,您可以在編譯時選擇使用哪個#pragma來鏈接哪個庫。這第二種技術並不能完全解決你的問題(因爲如果程序員試圖強制它不停止鏈接),但它是處理這種困難的一種常規方式(並且在複雜的構建環境中具有優勢)
使用#error指令,將中止編譯:
#ifndef RELEASE_VERSION
#error Release version required
#endif
還可以檢查安裝腳本中的二進制文件/庫。雖然不是C的答案。
-1提問者希望庫和可執行文件匹配 - 他不希望被編譯發佈。 – Elemental 2011-01-31 12:15:50