Unit testing armadillo与boost单元测试框架的连接问题

Unit testing armadillo与boost单元测试框架的连接问题,unit-testing,boost,armadillo,Unit Testing,Boost,Armadillo,我正在尝试将myclass.hpp和myclass.cpp中定义的使用犰狳的类链接到Boost UTF文件Boost_UTF.cpp。如果我不包含任何外部类,那么编译boost_utf.cpp不会有任何问题,即只定义要在单元测试之上的boost_utf.cpp中测试的函数。编辑:我还应该提到,如果我在myclass.cpp中包含一个main()并在那里测试dp函数,那么myclass.cpp的编译和运行就很好 但是当我试图包含myclass.cpp时,我得到了错误 o:在函数myclass::d

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

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

o:在函数
myclass::dp(arma::Col,arma::Col)中:
myclass.cpp:(.text+0x1ae):未定义对
wrapper\u ddot\u的引用 collect2:错误:ld返回了1个退出状态

我使用的编译过程是

g++-cmyclass.cpp-O1-larmadillo

g++myclass.o boost\u utf.cpp-L/home/me/bin/boost\u libs/lib-lboost\u unit\u test\u 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);
};
//文件boost\u utf.cpp
#定义BOOST_TEST_模块MyTest
#包括
#包括“myclass.hpp”
intadd(inti,intj){返回i+j;}
增压自动测试案例(我的测试)
{
增压检查相等(加(2,2,4);
myclass me=myclass();
增压检查相等(me.add(3,2),5);
BOOST_CHECK_EQUAL(me.add(3,2),1);
vec y=1(3);
增压检查相等(me.dp(y,y),14);
}
\\文件myclass.cpp
#包括“myclass.hpp”
int myclass::add(int x,int y){
返回x+y;
}
双myclass::dp(向量x,向量y){
返回(作为标量(x.t()*y));
}
\\文件myclass.hpp
#包括
#包括
使用arma;
类myclass{
公众:
整数加(整数x,整数y);
双dp(vecx,vecy);
};

使用
-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
开关的情况下使事情正常工作

有关选项和开关的说明,请参见

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

double myclass::dp(vec& x, vec& y){
  return (as_scalar(x.t()*y));
}
注意函数声明中使用的
&
。这样可以防止复制。该函数仍像以前一样使用:
dp(a,b)

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

double myclass::dp(const vec& x, const vec& y){
  return (as_scalar(x.t()*y));
}
常量引用允许编译器更积极地进行优化