undefined reference problem for a function

Hi All,
im compiling my program in g++ ,it is reporting error as undefined reference to `svm_destroy_param'
this is my sample code....
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
/*******svm.h********/
#ifndef _LIBSVM_H
#define _LIBSVM_H

#define LIBSVM_VERSION 288

#ifdef __cplusplus
extern "C" {
#endif
struct svm_parameter
{
.
.
};
.
.
void svm_destroy_param(struct svm_parameter *param);
.
.
#ifdef __cplusplus
}
#endif

#endif // _LIBSVM_H 

/*********svm.cpp**********/
void svm_binary_svc_probability(const svm_problem *prob, const svm_parameter *param, double Cp, double Cn, double& probA, double& probB)//this function is defined globally(line 1892)
{
int i;
	int nr_fold = 5;
	int *perm = Malloc(int,prob->l);
	double *dec_values = Malloc(double,prob->l);

	// random shuffle
	for(i=0;i<prob->l;i++) perm[i]=i;
	for(i=0;i<prob->l;i++)
	{
		int j = i+rand()%(prob->l-i);
		::swap(perm[i],perm[j]);
	}
	for(i=0;i<nr_fold;i++)
	{
		int begin = i*prob->l/nr_fold;
		int end = (i+1)*prob->l/nr_fold;
		int j,k;
		struct svm_problem subprob;

		subprob.l = prob->l-(end-begin);
		subprob.x = Malloc(struct svm_node*,subprob.l);
		subprob.y = Malloc(double,subprob.l);
		subprob.validation=1; // mark as a validation call

		k=0;
		for(j=0;j<begin;j++)
		{
			subprob.x[k] = prob->x[perm[j]];
			subprob.y[k] = prob->y[perm[j]];
			++k;
		}
		for(j=end;j<prob->l;j++)
		{
			subprob.x[k] = prob->x[perm[j]];
			subprob.y[k] = prob->y[perm[j]];
			++k;
		}
		int p_count=0,n_count=0;
		for(j=0;j<k;j++)
			if(subprob.y[j]>0)
				p_count++;
			else
				n_count++;

		if(p_count==0 && n_count==0)
			for(j=begin;j<end;j++)
				dec_values[perm[j]] = 0;
		else if(p_count > 0 && n_count == 0)
			for(j=begin;j<end;j++)
				dec_values[perm[j]] = 1;
		else if(p_count == 0 && n_count > 0)
			for(j=begin;j<end;j++)
				dec_values[perm[j]] = -1;
		else
		{
			svm_parameter subparam = *param;
			subparam.probability=0;
			subparam.C=1.0;
			subparam.nr_weight=2;
			subparam.weight_label = Malloc(int,2);
			subparam.weight = Malloc(double,2);
			subparam.weight_label[0]=+1;
			subparam.weight_label[1]=-1;
			subparam.weight[0]=Cp;
			subparam.weight[1]=Cn;
			struct svm_model *submodel = svm_train(&subprob,&subparam,0);
			for(j=begin;j<end;j++)
			{
				svm_predict_values(submodel,prob->x[perm[j]],&(dec_values[perm[j]])); 
				// ensure +1 -1 order; reason not using CV subroutine
				dec_values[perm[j]] *= submodel->label[0];
			}		
			svm_destroy_model(submodel);
			svm_destroy_param(&subparam);
		}
		free(subprob.x);
		free(subprob.y);
	}		
	sigmoid_train(prob->l,dec_values,prob->y,probA,probB);
	free(dec_values);
	free(perm);

}

void svm_destroy_param(svm_parameter* param)//defined globally (line 2992)
{
if (param->weight_label!=NULL) 
	{
		free(param->weight_label);
		param->weight_label=NULL;
	}
	if (param->weight!=NULL) 
	{
		free(param->weight);
		param->weight=NULL;
	}
}

i have also tried defining svm_destroy_param before the line 1892 and also declaring its prototype but no use,then also im getting the same problem
i dont know why its reporting error please let me know where i have went wrong
waiting for your reply..............
Last edited on
I seriously have no reasonable idea, but it appears as though no one else is online or looking to reply at the moment, so I'll throw in my uninformed guess:

1
2
/*******svm.h********/
#ifndef _LIBSVM_H 


Would you're header not have to match the macro which checks for a file called libsvm.h, not svm.h?

I haven't been able to find any "rules" that state I'm right, but that's all I got.
Think about what you're doing: line 17 says "svm_destroy_param" expects a pointer to an svm_parameter object (drop the "struct" by the way. If you declare a structure, it becomes a type like any other), but then on line 32 you pass a reference to an svm_parameter object.

Besides that, it also seems you never defined svm_destroy_param. It's forward-declared in your header file, but there is no definition [in the code you provided].
closed account (1vRz3TCk)
How is subparam defined?
i have edited my topic and included the definations
Topic archived. No new replies allowed.