簡體   English   中英

如何識別庫是DEBUG還是RELEASE構建?

[英]How to identify if a library is DEBUG or RELEASE build?

我們的項目使用許多靜態庫來構建應用程序。 我們如何確保在發布版本的應用程序中使用發布版本的庫?

我們通過在發布應用程序構建中使用調試庫來犯錯誤。

我正在尋找一種優雅的方式,我可以編寫一個模塊,我們可以檢查特定的庫是否發布或調試,如果不匹配則報告它。 我們的應用程序是用C / C ++編寫的。 (平台MSVC和GCC)

是。 您可以檢查文件的IMAGE_FILE_HEADER結構的“ Characteristics字段。 如果庫是發布版本,則將設置位0x0200( DEBUG_STRIPPED ); 在調試版本中,它將很清楚。

您可以在“網絡”(例如此處 )的各個位置找到有關Windows EXE和DLL使用的PE格式的技術信息,以了解如何檢索該結構。

你能不能用命名約定解決這個問題(即foo_rel.afoo_dbg.a )?

通常的方法是為庫提供不同的名稱或將它們存儲在不同的目錄中,例如Debug和Release。 如果您的構建正確自動化,我無法看到您如何犯錯誤。

除了命名約定,如果你在類似unix的系統上,你可以解析輸出:

objdump -g mylib.a

如果只獲得以對象文件名開頭的空行或行,則庫中沒有調試信息。

請注意,這通常不意味着庫是“發布”或“調試”,但它可能意味着在您的情況下。

如何使用一個返回庫版本的簡單函數? 根據您的構建進行調試或發布,返回不同的內容。 在應用程序開始時調用該函數並報告錯誤。

我使用並成功測試了這段代碼:

using System.Diagnostics;

FileVersionInfo fvi = FileVersionInfo.GetVersionInfo(fileName);
return fvi.IsDebug;

通常,人們會使用稍微不同的名稱來區分版本。 例如,在調試版本中,所有庫在其擴展名之前都帶有字符“d”。 防爆。 commonUtilsd.lib在發布模式下, commonUtils.lib也是commonUtils.lib 這種方法恕我直言更簡單,更清潔。 在MSVC中,使用可以指定輸出文件名

Librarian-->General-->Output File

另一個建議是將這些輸出文件放在配置目錄中。 即在Debug文件夾中有debug-version,在Release文件夾下有release-versions。 再次在MSVC下,這可以使用$(ConfigurationName)IDE-macro一般完成。 並在構建期間在查找目錄中附加正確的路徑。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM