编译检查是否编译为静态库

时间:2012-12-27 10:14:32

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

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

是否有某种静态断言或其他可以检查的标志?

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

我正在使用Visual Studio 2010

3 个答案:

答案 0 :(得分:7)

在预定义的宏列表中没有这样的东西 - 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)将堆叠以前属性表中的定义。确保它也包含在项目属性中!

要添加属性表,请导航至查看|其他Windows | Visual Studio中的Property Manager

答案 1 :(得分:0)

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

或者,您可能意味着“如何检查文件是否正在编译为库” - 没有办法(除了编译器定义)。

答案 2 :(得分:-1)

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。

Project Property highlighting Configuration Type setting

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

Sample project configuration mixup in configuration manager