【问题标题】:Compile check if compiling as static library编译检查是否编译为静态库
【发布时间】:2012-12-27 10:14:32
【问题描述】:

如果项目正在编译为 lib,我如何在编译时检查? (静态库)

我可以检查某种静态断言或其他标志吗?

我自己无法添加预处理器变量,因为它是一个将用于公司其他项目的实用程序。所以我想知道是否有一些默认情况下正在发送的预处理器标志或其他东西。

我正在使用 Visual Studio 2010

【问题讨论】:

  • 取决于工具和编译器。您想要 Visual C++ 或 g++ 的答案吗?您现在如何编译您的项目?
  • 与什么比较?到动态库还是到可执行文件?后者不起作用(可靠地,跨平台),因为这是在链接时决定的。前者可能是可能的。自己添加一个预处理器变量可能会更好。
  • 在命令行中添加-DSTATIC_LIBRARY,并使用#ifdef进行测试?
  • 我使用的是 Visual Studio 2010。我自己无法添加预处理器变量,因为它是一个实用程序,将在公司的其他项目中使用。
  • 如果依赖于它,你的代码会很糟糕。

标签: c++ visual-studio-2010 compilation static-libraries


【解决方案1】:

预定义的宏列表中没有这样的东西 - http://msdn.microsoft.com/en-us/library/b0084kay%28v=vs.100%29.aspx

但默认情况下,如果是“静态库”项目,MSVC 会将_LIB 添加到预处理器定义列表中。
(它还为 DLL 添加了_USRDLL

编辑:在 Visual Studio 2017 中,DLL 的定义是 _WINDLL(来自 IDE 应用的“Windows 动态链接库”属性表)。 _LIB 定义不再可用。

另一种解决方案是使用以下预处理器定义将属性表添加到项目(检查到您的版本控制存储库中):_$(OutputType);%(PreprocessorDefinitions)

$(OutputType) 将解析为 DLL 的“库”和静态库的“staticlibrary”,分别导致 _library_staticlibrary 定义(或 _exe 用于应用程序)。

%(PreprocessorDefinitions) 将从以前的属性表中堆叠定义。确保它也包含在项目属性中!

要添加属性表,请导航至 查看 |其他窗口 | Visual Studio 中的属性管理器

【讨论】:

    【解决方案2】:

    如果您使用的是 Visual Studio,我看不出添加您自己的预处理器定义有什么问题。这背后的原因是您无论如何都必须提供项目文件,因此该选项将与项目文件一起正确分发。

    或者,您可能的意思是“如何检查文件是否被编译为库”——没有办法(编译器定义除外)。

    【讨论】:

    • 最明智的做法是直接去找项目负责人并询问您或他是否可以在其中放入适当的选项,因为这确实是最简单的方法。
    • @YochaiTimmer 会不会让您的问题与众不同并且更适合,也许,[P.SE]?
    • 不,我的意思是我需要一个编程解决方案,而不是“去告诉所有人”的解决方案。如果这是我的解决方案或项目,我会正确使用它。但是在基础设施上工作时,您需要以编程方式进行并展望未来。基础设施不能依赖于不稳定的个人知识,它应该在没有任何外部参与(例如添加额外变量)的情况下工作并继续工作。
    • 在我的模式尺度中,单例模式实际上非常接近“糟糕的设计”。
    • @Yochai “我赞成放弃 Singleton。它的使用几乎总是一种设计气味。” — says Erich Gammathe famous GoF 之一,它如此受欢迎。如果您想要更详细的讨论,SO 用户 jalf has it 在他的博客上。
    【解决方案3】:

    在 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 -&gt; General -&gt; Configuration Type 中的项目属性页中,您可以指定程序集的构建方式。如果有意义的话,你甚至可能会偏离目标扩展,例如在构建一些 BoostPython 的东西时,我将 dll 更改为 pyd。

    为了突出我正在谈论的那种不稳定的混合,这可能是由于错误或有缺陷的合并或其他原因,您可以检查解决方案配置下每个项目的逐项构建设置。我在下面给出了一个示例,其中解决方案平台是 ReleaseOffline,但解决方案中的各种项目都被拨入 Release、DebugStatic 等。屏幕截图中许多项目都已关闭,但您可以想象混合依赖项会使事情变得糟糕状态混合构建类型。一些混淆可能是故意的,因此请确保您知道自己在做什么/正在寻找什么,因为 Visual Studio 在这些配置中提供了这种灵活性。还要记住,您看到的设置特定于所选的配置/平台对。更改其中任何一个,您可能会看到上面讨论的所有值的变化。

    【讨论】:

      猜你喜欢
      • 2011-08-15
      • 2020-05-17
      • 1970-01-01
      • 2015-03-06
      • 2012-05-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多