正如其他人所說,沒有單一的標準文件在窗口上命名。
對於我們完整的產品基地,涵蓋了100多個exes,dll和靜態庫,我們已經成功使用了以下多年,它已經節省了很多困惑。它基本上是我多年來見過的幾種方法的混合。
簡而言之,我們所有的文件既有前綴又有後綴(不包括擴展本身)。它們都以「om」(基於我們的公司名稱)開頭,然後有1或2個字符組合,大致標識代碼區域。
該後綴解釋了它們是什麼類型的內置文件,根據包含Unicode,靜態,調試(Dll構建是默認設置並且沒有明確的後綴標識符)的構建,最多包含三個組合使用的字母。當我們開始這個系統時,Unicode並不是那麼流行,我們不得不支持Unicode和非Unicode編譯(在Windows 2000之前),現在一切都是專門構建的unicode,但我們仍然使用相同的命名法。
因此,一個典型的.lib文件的「設置」可能看起來像
omfThreadud.lib (Unicode/Debug/Dll)
omfThreadusd.lib (Unicode/Static/Debug)
omfThreadu.lib (Unicode/Release/Dll)
omfThreadus.lib (Unicode/static)
所有文件都內置到一個共同的bin文件夾,從而消除了大量的DLL地獄問題的開發商,也使調整編譯器/鏈接器設置更簡單 - 它們都使用相對路徑指向相同的位置,並且從不需要手動(或自動)複製項目所需的庫。擁有這些後綴還可以消除您對可能具有的文件類型的任何混淆,並且可以確保您無法在混合場景中將調試DLL放在發佈套件上,反之亦然。所有exes也使用類似的後綴(Unicode/Debug)並構建到同一個bin文件夾中。
同樣有一個單獨的「包含」文件夾,每個庫在include文件夾中都有一個與庫/ dll名稱相匹配的頭文件(例如omfthread.h)該文件本身#包含所有其他項被該圖書館曝光。如果你想要foo.dll中的功能,你只需#include「foo.h」;我們的圖書館在功能方面進行了高度細分 - 實際上我們沒有任何「瑞士軍刀」dll,因此包括整個功能庫都是合理的。 (這些標題中的每一個還包括其他必備標題,無論它們是我們的內部庫還是其他供應商SDK)
其中每個包含文件的內部使用宏使用#pramga將相應的庫名添加到鏈接器行,不需要擔心這一點。我們大多數庫可以靜態構建或作爲一個DLL構建,並使用#define OM_LINK_STATIC(如果已定義)來確定單個項目需要哪個(我們通常使用DLL,但在某些情況下,內置於.exe中的靜態庫部署或其他原因更有意義)
#if defined(OM_LINK_STATIC)
#pragma comment (lib, OMLIBNAMESTATIC("OMFTHREAD"))
#else
#pragma comment (lib, OMLIBNAME("OMFTHREAD"))
#endif
這些宏(OMLIBNAMESTATIC & OMLIBNAME)使用_DEBUG確定它是什麼類型的構建和生成適當的庫名添加到鏈接線。
我們在庫的靜態& dll版本中使用通用定義來控制在dll構建中正確導出類/函數。從庫導出的每個類或函數都裝飾着這個宏(其名稱爲庫相匹配的基本名稱,但在很大程度上是不重要的)
class OMUTHREAD_DECLARE CThread : public CThreadBase
在項目設置的DLL版本中,我們定義OMFTHREAD_DECLARE = __ declspec(dllexport),在庫的靜態庫版本中,我們將OMFTHREAD_DECLARE定義爲空的。
在庫的頭文件,我們把它定義基於客戶端是如何試圖鏈接到它
#if defined(OM_LINK_STATIC)
#define OMFTHREAD_DECLARE
#else
#define OMFTHREAD_DECLARE __declspec(dllimport)
#endif
希望使用我們的內部圖書館之一隻想補充適當的包含於一個典型的項目其stdafx.h(通常),它只是工作,如果他們需要鏈接到靜態版本,他們只是將OM_LINK_STATIC添加到他們的編譯器設置(或在stdafx.h中定義它),它再次它只是工作。
SCons的也使用_env.SharedLibrary_和_env.StaticLibrary_具有相同目標的名字時, 「創建(這)相當不愉快的衝突」。 – 2017-01-11 23:41:19