2010-03-18 47 views
1

我正在開發一個C++項目,用於生成其他團隊使用的lib。它被製作在幾個不同的口味:如何命名平臺特定的lib文件?

  1. Win 32調試動態
  2. Win 32調試靜態
  3. Win32發佈動態
  4. Win32發佈靜態
  5. 64調試動態
  6. 64調試靜態
  7. x64發佈動態
  8. x64發佈靜態

我想知道什麼是最好的智慧是如何命名DLL和什麼參數是針對不同的命名約定。我是否將這些庫輸出到不同的目錄中,或者是在庫的末尾附加一些字母來區分它們,還是別的?一個問題是,如果我使用目錄,但不給所有庫的不同名稱,那麼庫的用戶在意外使用錯誤的lib時會遇到問題。這些擔憂是否有效?

非常感謝。

回答

1

我使用命名約定來消除歧義,將所有不同的風味輸出到相同的目錄中。通過將它們放在同一目錄中,鏈接器目錄不必在flavor之間進行切換。然後使用設置的預處理器指令鏈接庫,該指令爲正在編譯的風味選擇#pragma (lib,...)指令。

+0

嗯是的,好點,我沒有想到使用#pragma(lib)。這可以很好地選擇正確的平臺和配置。但是,在動態庫和靜態庫之間選擇可能不太好。也許用戶可以在他們的項目設置中指定一個#LIBRARYNAME_STATIC或#LIBRARYNAME_DLL或其他東西來進行選擇。你認爲那樣會好嗎? – 2010-03-18 11:27:11

+0

啊,我以爲動態/靜態是指庫是連接到動態CRT還是靜態CRT。如果您嘗試在靜態鏈接和動態鏈接之間進行選擇,則必須使用一些自定義的#define。 – 2010-03-18 11:42:38

2

使用Microsoft約定可能是個好主意。靜態版本的前綴是「lib」。調試版本是後綴「d」。 64位版本位於amd64子目錄中。不是最大的約定,但至少它是熟悉的。

在MSVC中,您可以使用預定義的_DLL宏來檢測用戶是否選擇了CRT的DLL版本。如果選擇64位編譯,則定義_WIN64宏。足以生成所需的#pragma註釋(lib,「name」)指令。

2

我認爲boost通過在特定平臺之後命名.lib文件來處理這個問題。我喜歡包括以下信息:

  1. 編譯器的主要版本(即 「VC80」, 「vc91」 等)
  2. 運行時版本(即 「MT」, 「抑鬱症」 等)
  3. 例如,如果你的庫被命名爲「NetInfo」,它是版本1.2.3,它被動態鏈接到調試CRT,你的庫版本(即「1.0」,「2.1.1234」等)

例如,它是用Visual Studio 2005構建的:

NetInfo_1.2.3_vc80_mdd 

唯一要擔心的是人們如何消耗你的圖書館:靜態或動態。我通常這樣做的方式如下:

如果您的庫鏈接到動態CRT,則您的庫作爲DLL提供;否則,您的庫將作爲靜態庫提供。原因是,如果人們動態鏈接到CRT,那麼可以肯定他們不介意動態鏈接到你的庫。如果你想提供兩個選項,那麼我通常會在末尾加上「s」來表示它是一個靜態庫;缺少「s」表示它是一個動態庫。

例子:

NetInfo_1.2.3_vc80_mdds.lib - static library, links with dynamic debug CRT 
NetInfo_1.2.3_vc80_mds.lib - static library, links with dynamic release CRT 
NetInfo_1.2.3_vc80_mtds.lib - static library, links with static debug CRT 
NetInfo_1.2.3_vc80_mts.lib - static library, links with static release CRT 
NetInfo_1.2.3_vc80_mdd.lib - import library, links with dynamic debug CRT 
NetInfo_1.2.3_vc80_mdd.dll - dynamic library, links with dynamic debug CRT 
NetInfo_1.2.3_vc80_md.lib - import library, links with dynamic release CRT 
NetInfo_1.2.3_vc80_md.dll - dynamic library, links with dynamic release CRT 
NetInfo_1.2.3_vc80_mtd.lib - import library, links with static debug CRT 
NetInfo_1.2.3_vc80_mtd.dll - dynamic library, links with static debug CRT 
NetInfo_1.2.3_vc80_mt.lib - import library, links with static release CRT 
NetInfo_1.2.3_vc80_mt.dll - dynamic library, links with static release CRT 

這種方法是一些額外的工作,但它涵蓋了所有的基地。如果你提供不同的平臺,那麼你應該在那裏粘貼「x86」和「x64」。

然後在你的頭文件中,你可以使用_WIN64,_DLL和_​​DEBUG宏來找出需要插入哪個庫。如果你全力以赴併爲所有選項提供靜態和動態庫,那麼你將需要一個額外的定義NETINFO_USE_STATIC_LIB來確定是否引入動態或靜態風格。

此方法允許您將所有文件保留在同一目錄中,並通過查看文件的名稱讓您知道具體內容。缺點是有些人可能會抱怨加載一個名爲dll的文件,而不是一個簡單的「NetInfo.dll」(特別是如果他們使用的是LoadLibrary),但這確實是一個小問題。似乎並不能阻止人們使用助推器。