无法将犰狳与提升单元测试框架联系起来

Posted

技术标签:

【中文标题】无法将犰狳与提升单元测试框架联系起来【英文标题】:Trouble linking armadillo with boost unit testing framework 【发布时间】:2014-12-19 01:47:48 【问题描述】:

我正在尝试将使用犰狳的 myclass.hpp 和 myclass.cpp 中定义的类链接到 Boost UTF 文件 boost_utf.cpp。如果我不包含外部类,那么编译 boost_utf.cpp 就没有问题,即只在单元测试上方定义要在 boost_utf.cpp 中测试的函数。编辑:我还应该提到,如果我在 myclass.cpp 中包含 main() 并在那里测试 dp 函数,myclass.cpp 编译和运行就很好。

但是当我尝试包含 myclass.cpp 时,我得到了错误

myclass.o:在函数myclass::dp(arma::Col<double>, arma::Col<double>)': myclass.cpp:(.text+0x1ae): undefined reference towrapper_ddot_' collect2:错误:ld 返回 1 个退出状态

我使用的编译过程是

g++ -c myclass.cpp -O1 -larmadillo

g++ myclass.o boost_utf.cpp -L/home/me/bin/boost_libs/lib -lboost_unit_test_framework -static -std=c++11

我的文件是

//FILE boost_utf.cpp
#define BOOST_TEST_MODULE MyTest
#include <boost/test/unit_test.hpp>
#include "myclass.hpp"

int add( int i, int j )  return i+j; 

BOOST_AUTO_TEST_CASE( my_test )

  BOOST_CHECK_EQUAL( add( 2,2 ), 4 );    
  myclass me = myclass();
  BOOST_CHECK_EQUAL(me.add(3,2),5);
  BOOST_CHECK_EQUAL(me.add(3,2),1);
  vec y = ones<vec>(3);
  BOOST_CHECK_EQUAL(me.dp(y,y),14);


\\FILE myclass.cpp
#include "myclass.hpp"


int myclass::add(int x, int y)
  return x + y;


double myclass::dp(vec x, vec y)
  return (as_scalar(x.t()*y));


\\FILE myclass.hpp
#include<stdlib.h>
#include<armadillo>

using namespace arma;

class myclass
public:
 int add(int x, int y);
 double dp(vec x, vec y);
;

【问题讨论】:

【参考方案1】:

使用-c 开关进行编译时,不会进行任何链接。 g++ 只生成 myclass.o,而不链接到犰狳运行时库。

解决方案是在生成最终可执行文件时进行链接:

g++ -c myclass.cpp -O2

g++ myclass.o boost_utf.cpp -O2 -larmadillo -L/home/me/bin/boost_libs/lib -lboost_unit_test_framework -static -std=c++11

您可能还想首先在没有-static 开关的情况下让事情正常工作。

选项和开关在GCC manual中都有解释。

附带说明,出于性能原因,不要将向量(或矩阵)按值传递给函数。相反,声明函数以接受引用。例如:

double myclass::dp(vec& x, vec& y)
  return (as_scalar(x.t()*y));

注意在函数声明中使用&amp;。这可以防止制作副本。该函数仍然像以前一样使用:dp(a,b)

如果向量不需要修改,使用 const 引用:

double myclass::dp(const vec& x, const vec& y)
  return (as_scalar(x.t()*y));

const 引用允许编译器更积极地优化。

【讨论】:

以上是关于无法将犰狳与提升单元测试框架联系起来的主要内容,如果未能解决你的问题,请参考以下文章

python单元测试pytest

将 AddOrUpdate 与 Entity Framework 6 Repository 一起使用的单元测试方法

集成测试框架

如何将 CMock 单元测试框架与 Make 集成

将 objc 动态框架与另一个 objc 动态框架链接会使 swift 单元测试目标失败

单元测试错误:无法从同步测试中调用 Promise.then