如果项目正在编译为 lib,我如何在编译时检查?(静态库)
我可以检查某种静态断言或其他标志吗?
我自己无法添加预处理器变量,因为它是一个实用程序,将在公司的其他项目中使用。所以我想知道是否有一些默认情况下正在发送的预处理器标志或其他东西。
我正在使用 Visual Studio 2010
如果项目正在编译为 lib,我如何在编译时检查?(静态库)
我可以检查某种静态断言或其他标志吗?
我自己无法添加预处理器变量,因为它是一个实用程序,将在公司的其他项目中使用。所以我想知道是否有一些默认情况下正在发送的预处理器标志或其他东西。
我正在使用 Visual Studio 2010
预定义的宏列表中没有这样的东西 - http://msdn.microsoft.com/en-us/library/b0084kay%28v=vs.100%29.aspx。
但默认情况下,如果 MSVC_LIB
是“静态库”项目,它会添加到预处理器定义列表中。
(它也_USRDLL
为 DLL 添加)
编辑:在 Visual Studio 2017 中,DLL 的定义是_WINDLL
(来自 IDE 应用的“Windows 动态链接库”属性表)。该_LIB
定义不再可用。
另一种解决方案是使用以下预处理器定义将属性表添加到项目(签入您的版本控制存储库)_$(OutputType);%(PreprocessorDefinitions)
:.
$(OutputType)
将解析为 DLL 的“库”和静态库的“静态库”,分别产生_library
和_staticlibrary
定义(或_exe
应用程序)。
%(PreprocessorDefinitions)
将从以前的属性表中堆叠定义。确保它也包含在项目属性中!
要添加属性表,请导航至查看 | 其他窗口 | Visual Studio 中的属性管理器。
如果您使用的是 Visual Studio,我看不出添加您自己的预处理器定义有什么问题。这背后的原因是您无论如何都必须提供项目文件,因此该选项将与项目文件一起正确分发。
或者,您可能的意思是“如何检查文件是否被编译为库” - 没有办法(除了编译器定义)。
特定程序集的构建内容在 vcxproj 文件中明确设置,它是已知的并在编译时间之前设置。可能棘手的是,在配置管理器中显示的解决方案文件设置中,您的解决方案配置和平台可能已经确定了一些与您的解决方案构建不一致的项目配置和平台。
在 vcxproj xml 中,构建输出类型将显示为<ConfigurationType>
元素的值。
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
类似地,在项目属性页中Configuration Properties -> General -> Configuration Type
,您可以指定程序集的构建方式。如果有意义的话,你甚至可能会偏离目标扩展,例如在构建一些 BoostPython 东西时,我将 dll 更改为 pyd。
为了突出我正在谈论的那种不稳定的混合,这可能是错误的或有缺陷的合并或其他原因,您可以检查解决方案配置下每个项目的逐项构建设置。我在下面给出了一个示例,其中解决方案平台是 ReleaseOffline,但解决方案中的各种项目被拨入 Release、DebugStatic 等。屏幕截图中许多项目都已关闭,但您可以想象混合依赖项会使事情变得糟糕状态混合构建类型。一些混淆可能是故意的,因此请确保您知道自己在做什么/正在寻找什么,因为 Visual Studio 在这些配置中提供了这种灵活性。还要记住,您看到的设置特定于所选的配置/平台对。改变其中任何一个,你'