2011-03-11 30 views
5

我有一個庫,它支持#define來控制它的構建方式。然而,該庫可以被多個想要不同版本的EXE項目使用。我可以讓app/EXE項目在構建時設置庫使用的#define,還是將其設置在解決方案中?您可以在加載的項目上創建一個VC++解決方案集預處理器#define嗎?

我能想到的唯一的其他選擇是在庫項目上創建單獨的構建配置,但這很快就會失去控制。對於例如unicode/non-unicode構建而言,這很常見,但最終會增加每個組合的配置數量。

+1

使用'config.h'文件來設置所需的預處理器定義,該庫文件包含在庫項目中,但由應用程序項目提供(缺點:每個解決方案文件不能包含多個應用程序項目) – smerlin 2011-03-11 17:07:09

+0

Isn'這與librik建議的相同嗎? – 2011-03-14 13:02:37

+0

是的,事實上......只是注意到了答案(儘管我的評論是在5小時後寫的..strange)。 – smerlin 2011-03-15 11:45:43

回答

5

以下方法假定每個.EXE/app(使用此庫)都有自己的Visual Studio解決方案。

您確實擁有對圖書館的控制權嗎?步驟1-3將更改其項目文件,並且步驟4將一個文件添加到庫源代碼。

  1. 設置項目屬性> C/C++>高級>強制包含到mylibrary_solution_defines.h

  2. 編輯項目屬性> C/C++>常規>其他包含目錄將$(SolutionDir);放在目錄列表的開頭。

  3. 將Project Properties> General> Output Directory和Intermediate Directory設置爲與解決方案目錄相關的內容。也許$(SolutionDir)$(ProjectName)\$(Configuration)?您希望確保爲每個使用它的解決方案重建庫;不應該有任何共享的.lib或.obj文件。

  4. 創建一個名爲mylibrary_solution_defines.h的空虛擬頭文件,並將其放入您的庫源代碼中,以便#include "mylibrary_solution_defines.h"永遠不會失敗。

  5. 在每個應用程序/ EXE解決方案中 - 假設您對使用此庫的每個應用程序有不同的解決方案,否則整個計劃將失敗 - 使用您的#defines創建一個mylibrary_solution_defines.h文件。

你看到發生了什麼?每個庫源文件隱式地爲#include s "mylibrary_solution_defines.h",並且它優先從解決方案目錄中獲取該文件。因此,每個解決方案的文件都可能不同。因此,如果您的解決方案ConsoleModeInterfaceProgram.sln需要使用#define TEXTONLY 1構建的庫,請將該行放入與ConsoleModeInterfaceProgram.sln位於同一目錄中的mylibrary_solution_defines.h

+0

謝謝,一直在尋找解決方案 – Paulus 2013-05-09 17:53:37

0

對於任何應用程序需要的每個庫版本,您都需要單獨的構建配置。這就是構建系統的設計方式。

唯一的出路是將'library'的源代碼直接添加到相應的應用程序項目中併爲每個項目設置正確的預處理器設置 - 這樣,您仍然可以享受到共享代碼庫的好處。

+0

這太可怕了:(對於N這樣的設置,你有2^N的build-configs。我希望我可以做一個項目將一個設置注入依賴項或使用預生成設置,或者有一些解決方案級別的設置。好吧。 – 2011-03-11 12:07:54

相關問題