我認爲boost通過在特定平臺之後命名.lib文件來處理這個問題。我喜歡包括以下信息:
- 編譯器的主要版本(即 「VC80」, 「vc91」 等)
- 運行時版本(即 「MT」, 「抑鬱症」 等)
- 例如,如果你的庫被命名爲「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),但這確實是一個小問題。似乎並不能阻止人們使用助推器。
嗯是的,好點,我沒有想到使用#pragma(lib)。這可以很好地選擇正確的平臺和配置。但是,在動態庫和靜態庫之間選擇可能不太好。也許用戶可以在他們的項目設置中指定一個#LIBRARYNAME_STATIC或#LIBRARYNAME_DLL或其他東西來進行選擇。你認爲那樣會好嗎? – 2010-03-18 11:27:11
啊,我以爲動態/靜態是指庫是連接到動態CRT還是靜態CRT。如果您嘗試在靜態鏈接和動態鏈接之間進行選擇,則必須使用一些自定義的#define。 – 2010-03-18 11:42:38