【问题标题】:Cross compiling unit tests with CppUnit or similar使用 CppUnit 或类似工具交叉编译单元测试
【发布时间】:2009-09-17 23:42:03
【问题描述】:

是否有人使用过像 CppUnit 这样的包来交叉编译 C++ 单元测试以在嵌入式平台上运行?

我在 Linux 机器上使用 G++ 来编译必须在 LynxOS 板上运行的可执行文件。我似乎无法获得任何常见的单元测试包来配置和构建将创建单元测试的东西。

我看到很多单元测试包,CppUnit、UnitTest++、GTest、CppUTest 等,但很少在交叉编译器场景中使用这些包。带有“配置”脚本的那些暗示这是可能的,但我似乎无法让它们配置和构建。

【问题讨论】:

  • 我在交叉编译项目中使用 Windows 和 Linux 上的 CppUnit。完全没有问题。您的具体问题是什么?

标签: c++ unit-testing cross-compiling


【解决方案1】:

在交叉编译的单元测试代码中,我的做法是使用本机工具链自行编译单元测试——通常是某种 x86 编译器。这些单元测试在构建机器上执行,而不是在嵌入式目标上。如果您正在使用存根和模拟编写严格的单元测试(而不是集成测试),那么您不应该依赖嵌入式硬件。如果没有...开始永远不会太晚。

这种方法的另一个好处是,对于非 x86 嵌入式目标,这种类型的单元测试有助于清除字节顺序问题、未初始化的变量和其他有趣的错误。

【讨论】:

    【解决方案2】:
    ./configure --prefix=/sandBox --build=`config.guess` --host=sh4-linux
    

    sh4-linux 是你要运行程序的平台。

    【讨论】:

      【解决方案3】:

      您可能想查看CxxTest。我没有将它用于交叉编译,但它完全基于头文件和 Python 脚本——没有编译库。它可能比其他人更容易适应。

      【讨论】:

        【解决方案4】:

        我没有在这里提供答案,但我不会接受不要在不同目标上运行单元测试的建议:你仍然需要,最好是系统和单元测试。

        否则,ARM/其他嵌入式 CPU 上的对齐错误等简单的事情不会被捕获。

        【讨论】:

          【解决方案5】:

          要交叉编译 CppUTest (v3.3),我必须覆盖 LD、CXX 和 CC make 变量。

          为了获得 CppUTest 和 CppUTestExt(用于 CppUMock)库及其测试,我使用了 CPPUTEST_HOME 目录中的以下命令:

          构建 libCppUTest.a:

          make all LD=sh4-linux-g++ CXX=sh4-linux-g++ CC=sh4-linux-gcc
          

          构建 libCppUTestExt.a(用于 CppUMock):

          make extensions LD=sh4-linux-g++ CXX=sh4-linux-g++ CC=sh4-linux-gcc
          

          然后,您可以将 CPPUTEST_HOME 中生成的 CppUTest_tests 和 CppUTestExt_tests 可执行文件复制到目标设备并在那里执行。

          假设 CppUTest 在您的目标上通过了它自己的测试,那么您就可以使用 CppUTest 开发您的测试了。只需将您的测试代码与交叉编译的 CppUTest 库链接并将生成的可执行文件复制到您的目标。然后运行从目标平台本身获取单元测试结果。

          【讨论】:

            【解决方案6】:

            听起来您需要为您的操作系统和架构以及您的开发/构建机器上的内容编译单元测试库。我更喜欢 Boost++ 单元测试框架。您可以下载为您的架构预先构建的东西,但通常必须自己编译。我通过谷歌搜索找到了一些解决方案,以了解如何交叉编译 boost(例如http://goodliffe.blogspot.com/2008/05/cross-compiling-boost.html)。 CppUnit 可能更容易交叉编译,没有尝试过。一般原则是一样的,你为你的开发架构和你的目标机器编译相同的库版本

            我对新目标的设置是为我的目标 OS/arch 编译必要的 Boost++ 库,然后编写测试以链接 Boost++ 库和要测试的代码。

            好处是您可以链接到您的 x86 Linux Boost++ 库或您的目标 Boost++ 库,因此您可以在您的目标和开发/构建机器上运行测试。

            我的一般设置如下所示:

            libs/boost/<arch>/<boost libs>
            src/foo.{cpp,h}
            tests/test_foo.cpp
            build/foo
            build/test_foo.<arch>
            

            我将编译的 Boost++ 库放在我所有项目的 libs/ 目录中所需的不同架构下,并在我的 Makefile 中引用这些库。源代码和测试使用指定的 arch 变量构建命令,这样我可以在我的开发机器上运行 test_foo.x86 并在我的目标上运行 test_foo.{arm,mips,ppc,etc.}。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2012-10-04
              • 2016-03-16
              • 1970-01-01
              • 2017-03-31
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多