运行时确定编译选项

时间:2010-03-02 18:33:06

标签: c++ visual-studio-2008

我需要能够在运行时确定用于构建可执行文件的编译选项。有没有办法做到这一点?

编辑:我对检测优化设置特别感兴趣。原因是我正在编写必须尽可能快地运行的商业软件。虽然我只是在修改和测试系统,但我没有做所有的优化,因为它需要太长时间。但我担心我可能不小心去发布一个未经优化的程序版本。我想做的是让程序在启动时给我一个视觉警告,说“这是慢版本 - 不要发布”。

编辑:也许我可以编写一些小实用程序作为预构建步骤运行?命令行是否存储在某个文件中?如果是,那么我可以提取它,然后把它写成一些包含文件作为字符串,嘿presto!

编辑:我的选择不在调试和发布之间。调试太慢了 - 我严格保留调试。我的日常选择是在优化和超优化之间(包括慢编译链接时间编译,甚至是配置文件引导优化)。

编辑:我经常对复杂的编译过程,不同的库,不同的预定义宏,不同的源文件等进行更改。必须维护多个几乎相同的项目文件似乎很笨拙仅在几个优化标志中有所不同。我更喜欢只在需要时在一个项目中切换几个标志并重新编译。我只是想让可执行文件自我测试它是如何创建的。

编辑: IIRC有一些方法可以让visual studio创建一个makefile。我可以请Visual Studio为我创建这个makefile作为预构建步骤吗?

10 个答案:

答案 0 :(得分:6)

我知道将构建系统中的信息传递给正在运行的程序的最佳方法是通过预处理器。您可以在命令行上传递预处理程序定义,并在内部使用它们来设置变量的值,选择代码或使用#ifdef的任何内容。

因此,设置构建系统以使用类似DEBUG_SET的程序来调试其调试版本等。


解决第二个“EDIT”,是的,预建和后置工具的命令行放在项目的vcproj文件中。它是一个XML文件,您应该在标签Configurations->工具下找到它,其名称属性类似于“VCPreBuildEventTool”。尝试使用GUI添加一个,然后在文本编辑器中打开文件,您应该看到。

在这里创建处理vcproj文件的工具是相当普遍的。我想知道我们是否不能使用评论中提到的那些属性表来代替......

答案 1 :(得分:4)

我想你可能会以错误的方式解决这个问题......

请参阅,当Visual Studio 启动时为您提供调试和发布配置时,没有什么能阻止您添加任意数量的编辑设置。

当然,对于日常使用,您不应该摆弄编译器设置等等。只需将它们设置一次,然后根据需要切换配置。

要添加更多配置,请使用Build-> Configuration Manager页面。在那里你将默认调试和发布,你可以创建自己的“超级发布”或任何你想要它的名称。

答案 2 :(得分:3)

为您的项目创建多个配置,例如Debug,Release&生产。更改每个配置的输出二进制文件的名称以匹配不同的配置。例如,MyApp_d.exe,MyDll_d.dll用于调试,MyApp_r.exe,MyDll_r.dll用于发布,以及MyApp.exe& MyDll.dll for Production。这将有助于保持所有不同的风格,而不必尝试添加代码(这将是缓慢和脆弱的),将在运行时检测哪种风味正在运行并执行一些魔术。

答案 3 :(得分:2)

在调用构建时,是否可以在文本文件中存储编译选项(或完整的命令行,如果有的话),并确保将该文件与可执行文件一起发送?

[这当然不优雅,但只想检查。]

答案 4 :(得分:2)

试图回答我自己的问题......

如果我在visual studio帮助系统中搜索“预定义的宏”,我将得到一个列出各种宏的页面,这些宏是根据各种编译选项定义的。它远非一个完整的答案,但它可能是我将要获得的最佳答案。

答案 5 :(得分:1)

多个编译器在编译时设置了不同的定义。然后您可以在程序中使用它们。 (它在运行时并没有真正检测到,它只是在编译过程中被“烘焙”到你的程序中的东西。)

对于GCC,他们会显示here。这些也包含优化级别。

Here是Visual Studio的列表。但是我不认为它包含优化级别,也许它有其他可以使用的信息。

因为这是将信息从编译器传递到可执行文件的最常用方法。我不认为这对视觉工作室来说是可能的。


答案 6 :(得分:1)

要做到这一点,你需要创建一个名为“SuperOptimised”的附加配置。您现在拥有标准配置(“Debug”和“Release”)和第三个“SuperOptimised”。这样做的问题在于它使项目的配置管理变得更加困难,要在三个配置之间更改常用设置,您需要在三个位置进行更改。

解决方案是使用“Property Sheets”(“。vsprops”文件)和“Property Manager”选项卡。您可以创建在所有三种配置中通用的属性表,以及Release,Debug和SuperOptimised的特定表。将常用设置与特定设置(使用属性继承)组合以管理配置 - “属性管理器”选项卡允许您执行此操作。您可以更改“.vsprops”文件以更改配置中的常用设置,而无需更改配置本身。

有关物业单的更多信息:

http://msdn.microsoft.com/en-us/library/a4xbdz1e(VS.80).aspx

最后,如果要检查在运行时构建的配置,请使用预处理器在“SuperOptimised”.vsprops文件中定义宏值,例如“SUPEROPTIMISED”。然后,您可以使用以下命令检查是否具有正确的构建:

#ifndef SUPEROPTIMISED
    // Warn the user that this is not a shipping build
#endif

这可能看起来很多工作,但通过属性表管理非平凡项目(尤其是多项目工作空间)可以大大降低进行配置更改时出错的可能性。

答案 7 :(得分:0)

Visual Studio 2008已经为您设置了此功能。创建新项目时,它会为您设置两个构建配置:Debug和Release。您可以使用工具栏控件在这些配置之间切换。

调试具有为调试而定制的设置,特别是关闭优化。

发布具有针对发布而量身定制的设置,特别是已启用优化。

预处理器宏DEBUG仅在Debug配置中定义,因此您可以轻松地执行以下操作:

#ifdef DEBUG
::MessageBox("You are using the debug version", "Warning - Slow", MB_OK);
#endif

另请注意,这些配置将其输出放在不同的文件夹中,因此很容易区分它们。

答案 8 :(得分:0)

听起来你已经设置了多个配置,你只想确定当前.exe是用哪个构建的,而不是确切地知道选择了哪些编译器选项?

如果是,那么以下是一些选项:

  1. 为每个配置构建一个不同的名称,例如App_d,App_super_optimized等
  2. 在每个配置中添加不同的符号定义,可以在启动时将其视为#defined
  3. 也许与2.结合使用除了你的发布版本之外,所有版本都需要一些文件存在,你不会分发。这样,即使你偶然发布它,你的用户也不能运行慢速版本。

答案 9 :(得分:-1)

我有一个技巧来检查我没有发布我的程序的调试版本。我将可执行文件和DLL的大小与上一版本的相同二进制文件的大小进行比较。它们必须具有相似的,通常略微增加的尺寸。如果我有一个文件的Debug版本,那么大小是Release版本的x3或x4大小。