Visual Studio 2010 - 尝试基于目标.exe有条件地编译静态库

时间:2011-03-17 16:18:58

标签: visual-studio-2010 linker static-libraries conditional-compilation

我有一个用于生产代码和测试代码的静态库。我希望只有在构建测试.exe时才能注入测试数据。我想使用预处理器#defines,而不是MSVS配置(例如,Debug vs. Release),因为我正在测试性能。 Debug构建关闭了优化,这在调试期间非常好,但在我想测试性能时却不那么好。

举个例子,假设我在MSVS中有Foo.lib,Production.exe和Test.exe项目。 Production.exe和Test.exe都链接Foo.lib。我希望Production.exe和Test.exe使用各自的预处理器定义重建Foo.lib,因此Foo.lib中的代码将根据它所针对的可执行文件进行有条件的编译。

我对其他解决方案持开放态度,我希望我能清楚地说出我的问题。关于堆栈溢出的第一篇文章。

2 个答案:

答案 0 :(得分:3)

您需要设置多个解决方案配置以支持您想要的每个方案。首先,我们将向静态库添加一个新的 Test 配置,并创建一个附带的 Test 解决方案配置:

  • 在Visual Studio的解决方案资源管理器中,右键单击顶级解决方案节点。
  • 点击配置管理器...
  • 在项目列表中找到您的C / C ++静态库项目。单击该项目的配置单元格。它将变成一个下拉列表。从该下拉列表中选择新..
    • 输入新项目配置的名称。无论你喜欢什么,都可以打在这些步骤中,我将其称为 Test
    • 对于从以下位置复制设置:字段,请选择发布,因为您需要一个启用了优化的测试配置。
    • 选中创建新的解决方案配置复选框。
    • 点击确定

现在,您可以使用所需的#defines修改静态库的新 Test 配置:

  • 解决方案资源管理器中查找您的C / C ++项目。右键单击它并选择属性...
  • 从右上角的配置下拉列表中选择新的测试配置。
  • 在左侧窗格中,选择配置属性| C / C ++ |预处理器
  • 在右侧,将您想要的#defines添加到预处理器定义
  • 列表中

...现在,您希望设置构建,以便您具有使用静态库的 Test 配置构建Test.exe的构建配置,以及具有库<的Release.exe em>发布配置。返回配置管理器(正如我们在上面的前两个步骤中所做的那样):

  1. 设置Release.exe的构建配置:

    • 在左上角的下拉列表中,选择发布作为有效的解决方案配置
    • 对于您的Release.exe项目,选择其发布配置,并确保选中构建
    • 对于Test.exe项目,请确保取消选中构建
    • 对于静态库,请选择其发布配置,并确保选中构建
  2. 设置Test.exe的构建配置:

    • 在左上角的下拉列表中,选择测试作为有效的解决方案配置
    • 对于您的Release.exe项目,请确保取消选中构建
    • 对于您的Test.exe项目,选择其发布配置(我认为这是您想要的),并确保选中构建
    • 对于静态库,请选择其测试配置,并确保选中构建
  3. 现在,当您将解决方案更改为 Test Release 配置时,我希望您拥有所需的构建行为。

答案 1 :(得分:3)

这听起来非常错误,测试数据不属于.lib。并且以与在目标机器上使用的方式不同的方式构建的测试代码不是真正的测试。 VS让你在这里摆脱困境,这是不可能的。您使用其他配置来更改.lib的构建方式。

让测试应用程序将测试数据提供给.lib。正如真实应用程序在部署后为其提供实际数据一样。