3

我有一个包含程序代码(模型)的 Visual Studio 项目。我创建了另一个项目来将增强测试放入其中。

问题是我无法让它工作。

我可以在项目中单独使用 boost 测试,但是只要我想将(参考等)链接到第一个项目(我想要运行测试的那个),boost 测试项目就不会编译:

1>E:\boost_1_53_0\boost/detail/interlocked.hpp(99): warning C4164: '_InterlockedExchange' : fonction intrinsèque non déclarée
1>E:\boost_1_53_0\boost/detail/interlocked.hpp(100): warning C4164: '_InterlockedExchangeAdd' : fonction intrinsèque non déclarée
1>E:\boost_1_53_0\boost/smart_ptr/detail/spinlock_w32.hpp(62): error C3861: '_InterlockedExchange' : identificateur introuvable

我在那里读到你不能

您的代码不是 C++ 而是“C++ CLI”,因此您不能使用 boost。C++ 没有系统命名空间。在每个 .cpp 文件中,您可以使用 C++/CLI(以及系统命名空间)或 boost。如果你想使用系统命名空间,你必须启用“通用语言运行时支持”,为了提升你必须禁用它

>> 谁能确认不能将 Boost 与 C++/CLI 程序一起使用?

4

2 回答 2

2

是的,有可能。

首先,您必须将您的 C++/CLI 项目更改为 /clr(/clr:pure 或 /clr:safe 将不起作用)。这允许您的项目以混合模式运行,即同时运行本机 C++ 和托管代码。
在 msdn.microsoft.com 上阅读更多信息

为 Visual Studio 设置 Boost.Test(将路径添加到 Boost 的 .h,并在链接器中添加 .lib 路径;您可能必须编译 Boost,因为在某些情况下它不是“仅标题”);这是一个很好的教程itee.uq.edu.au

就是这样,您可以编写和编译您的测试。

但是,由于 C++/CLI 代码和 Boost 的编译(很可能是链接)过程中的错误,我无法将 Boost 测试放在不同的项目中;所以我不得不将单元测试放在程序本身的代码中(尽管在单独的 .cpp 文件中,这是一个可以接受的解决方案)。

于 2013-05-29T07:45:20.887 回答
2

基本问题是,在像 boost 这样的 C++(非 CLI)代码中,您不能保存任何托管引用或指针。

我发现对于 C++/CLI 代码,通常最好使用 C# 测试框架。C# 可以与 C++/CLI 部分对话,后者可以与纯 C++ 部分对话。此外,C++/CLI 的大多数用例都是为 .Net 包装 C++ 或 C 代码,因此测试 .Net 可以看到的接口是自然的选择。

例如,我有一个项目,其中所有接口都用 C# 指定。一些实现使用 C++/CLI 并调用 boost 库,其他实现是纯 C#。单元测试是通用的,通用参数是被测的实际实现。

MSTest/vstest 的示例:

public class MyTest< T > where T : IMyInterface
{
    [TestMethod]
    public void foo() {...}
}

[TestClass]
public class TestCppCli : MyTest< CppCliImpl > {}

[TestClass]
public class TestCSharp : MyTest< CSharpImpl> {}
于 2013-05-29T08:21:19.093 回答