Hello there,
I am new to ROOT and I feel like I have asked this question a couple of times already, in different disguises. I will try to be as specific as possible. I downloaded the stand alone version of Minuit2 from github and built it according to the directions given there.
I am trying to compile the following piece of code
#include "Minuit2/FunctionMinimum.h"
#include "Minuit2/MnUserParameterState.h"
#include "Minuit2/MnPrint.h"
#include "Minuit2/MnMigrad.h"
#include "Minuit2/FCNBase.h"
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <cmath>
#include <sstream>
using namespace std;
using namespace ROOT::Minuit2;
class MinFcn : public FCNBase {
private:
const std::vector< std::vector<double> > & _data;
public:
MinFcn(const std::vector< std::vector<double> > & data) : _data(data) {}
~MinFcn() {}
double operator() (const std::vector<double> & params) const {
double X2 = 0.0;
for (int i=0;i<_data[0].size();i++) {
double x = _data[0][i];
//double y = _data[1][i];
double f = params[0]*x+params[1];
X2 += (_data[1][i]-f)*(_data[1][i]-f);
}
//cout << "X2 = " << X2 << endl;
return X2;
}
//set to 1 for chi-sq and 0.5 for log-likelihood
double Up() const {return 1.0;}
};
int main() {
vector< vector<double> > data(2);
data[0].push_back(1.0);
data[1].push_back(2.0);
data[0].push_back(1.5);
data[1].push_back(1.8);
data[0].push_back(2.0);
data[1].push_back(1.3);
//minimize
MinFcn fcn(data);
vector<double> params(2,1.0);
vector<double> err(2,0.1);
params[0] = 1.0;
params[1] = 1.0;
MnMigrad migrad(fcn, params, err);
FunctionMinimum minParams = migrad();
cout << " chi^2 = " << minParams.Fval() << endl;
cout << " at " << minParams.UserState().Value(0) << " " << minParams.UserState().Value(1) << endl;
return 0;
}
I called my file HelloWorld.cpp and I am trying to compile it with the following command:
g++ -I/Minuit2/inc -L/Minuit2/lib -lMinuit2 -o HelloWorld HelloWorld.cpp -std=c++11
and I get the following errors:
/tmp/ccn8WY50.o: In function `main':
HelloWorld.cpp:(.text+0x47f): undefined reference to `ROOT::Minuit2::MnUserParameterState::Value(unsigned int) const'
HelloWorld.cpp:(.text+0x4a3): undefined reference to `ROOT::Minuit2::MnUserParameterState::Value(unsigned int) const'
/tmp/ccn8WY50.o: In function `ROOT::Minuit2::BasicFunctionMinimum::UserState() const':
HelloWorld.cpp:(.text._ZNK4ROOT7Minuit220BasicFunctionMinimum9UserStateEv[_ZNK4ROOT7Minuit220BasicFunctionMinimum9UserStateEv]+0x9c): undefined reference to `ROOT::Minuit2::MnUserParameterState::MnUserParameterState(ROOT::Minuit2::MinimumState const&, double, ROOT::Minuit2::MnUserTransformation const&)'
/tmp/ccn8WY50.o: In function `ROOT::Minuit2::MnApplication::~MnApplication()':
HelloWorld.cpp:(.text._ZN4ROOT7Minuit213MnApplicationD2Ev[_ZN4ROOT7Minuit213MnApplicationD5Ev]+0xd): undefined reference to `vtable for ROOT::Minuit2::MnApplication'
/tmp/ccn8WY50.o: In function `ROOT::Minuit2::ModularFunctionMinimizer::~ModularFunctionMinimizer()':
HelloWorld.cpp:(.text._ZN4ROOT7Minuit224ModularFunctionMinimizerD2Ev[_ZN4ROOT7Minuit224ModularFunctionMinimizerD5Ev]+0xd): undefined reference to `vtable for ROOT::Minuit2::ModularFunctionMinimizer'
Can anybody tell me what I am doing wrong?