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

时间:2014-12-19 01:47:49

标签: unit-testing boost armadillo

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

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

  

myclass.o:在函数myclass::dp(arma::Col<double>, arma::Col<double>)': myclass.cpp:(.text+0x1ae): undefined reference to wrapper_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 个答案:

答案 0 :(得分:2)

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

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

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));
}

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

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

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

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