正如其他人所说,Windows上没有单一的文件命名标准。
对于我们涵盖数百个exe、dll和静态库的完整产品库,我们多年来成功地使用了以下方法,并且它已经节省了很多混乱。基本上,这是我多年来看到的几种方法的混合。
简而言之,我们所有的文件都有前缀和后缀(不包括扩展名本身)。它们都以“om”开头(基于我们公司名称),然后有一个大约识别代码区域的1或2个字符组合。
后缀解释了它们是什么类型的构建文件,并包括最多三个字母的组合,具体取决于构建方式,包括Unicode、Static、Debug(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-hell问题,并使调整编译器/链接器设置更加简单-它们都使用相对路径指向同一位置,从不需要手动(或自动)复制项目所需的库。 这些后缀也消除了任何有关文件类型的混淆,并保证您不会在发布工具包上放置调试dll或反之亦然。 所有exe文件也使用类似的后缀(Unicode/Debug)并构建到同一个bin文件夹中。
同样有一个单独的“include”文件夹,每个库在include文件夹中都有一个与库/dll名称匹配的头文件(例如omfthread.h)。该文件本身#include所有由该库公开的其他项。 如果您想要foo.dll中的功能,则仅需#include“foo.h”即可使其更简单;我们的库根据功能区域高度分段-实际上我们没有“瑞士军刀”dll,因此包含库的所有功能是有意义的。(每个这些标题还包括其他必要的标题,无论是我们的内部库还是其他供应商SDK)
每个这些包含文件都在内部使用宏,这些宏使用#pramga将适当的库名称添加到链接器行中,因此单个项目不需要关心它。我们的大多数库都可以静态构建或作为DLL构建,#define OM_LINK_STATIC(如果已定义)用于确定单个项目想要哪个(我们通常使用DLL,但在某些情况下,将静态库内置到.exe中更有意义,以便部署或其他原因)。
这些宏(OMLIBNAMESTATIC和OMLIBNAME)使用_DEBUG来确定构建类型,并生成正确的库名称以添加到链接器行中。
我们在静态和dll版本的库中使用一个常见的定义,以控制在dll构建中正确导出类/函数。从库中导出的每个类或函数都使用此宏进行修饰(其名称与库的基本名称匹配,但这在很大程度上并不重要)。
class OMUTHREAD_DECLARE CThread : public CThreadBase
在项目设置的DLL版本中,我们定义OMFTHREAD_DECLARE=__declspec(dllexport),在静态库版本中,我们将OMFTHREAD_DECLARE定义为空。
在库的头文件中,我们根据客户端尝试链接的方式进行定义。
一个想要使用我们内部库之一的典型项目只需将适当的包含文件添加到他们的stdafx.h中(通常是这样),然后它就可以正常工作。如果他们需要链接静态版本,只需将OM_LINK_STATIC添加到编译器设置中(或在stdafx.h中定义),然后它也可以正常工作。