未定义的引用’_ *’链接器错误

我在编译/链接以下C代码时遇到问题。 链接器抛出的错误如下所示:

pso.o:pso.c:(.text+0x41): undefined reference to '_ps' ... pso.o:pso.c:(.text+0x93): more undefined references to '_ps' follow 

这是我第一次为gcc编写C代码,所以我不确定如何解决这个问题。 我假设因为结构PS定义了我的头文件,它不知何故没有链接到pso.c. 但是,我确实在该源文件的顶部使用了#include“ps.h”语句。

我已经在下面包含了相关的源文件和头文件,以及我正在使用的make文件。 编写可链接的C代码是否缺少一个基本概念?

谢谢! 哦,这是一个粒子群优化器,如果你想知道:)

main.c文件:

 #define MAIN #include #include #include #include "ps.h" int main(int argc, char *argv[]) { int c; double test; int test_int; srand(time(NULL)); printf("starting pso\n"); pso(); printf("finished pso\n"); return(0); } 

有问题的文件,pso.c:

 #include #include "ps.h" double it(double C[]); void pso() { int i; int j; int k; puts("Now in PSO"); /* Initialize PSO controls */ psoi(); /* Initialize particle positions and velocities */ for (i=0;i<MPART;i++){ for(j=1;j<MINDV;j++){ /* positions */ ps.X[i][j]=(-1+2*random())*ps.bup; /* velocities */ ps.V[i][j] = (-1+2*random())*ps.bup / ps.vred; /* Transform */ ps.ut[j] = (ps.X[i][j] - ps.blo)/(ps.bup - ps.blo) * (ps.bnd_hi[i] - ps.bnd_lo[i]) + ps.bnd_lo[i]; } /* Evaluate Finess */ ps.fitness = fit(ps.ut); /* Update particle best position */ ps.pbest[i]=ps.fitness; /* Update swarm best position */ if(ps.pbest[i] < ps.sbest){ for(j=0;j<MINDV;j++){ ps.g[j]=ps.p[i][j]; } ps.sbest = ps.pbest[i]; } } /* Convergenve Loop */ for(k=2;k<ps.maxk;k++){ for(i=1;i<MPART;i++){ for(j=1;j<MINDV;j++){ /* Velocity Update */ ps.rp = random(); ps.rg = random(); ps.rr = random(); ps.chi = 0.7298; ps.V[i][j] = ps.chi * ( ps.V[i][j] + ps.phi_p*ps.rp*(ps.p[i][j] - ps.X[i][j]) + ps.phi_g*ps.rg*(ps.g[j] - ps.X[i][j])); /* Position Update */ ps.X[i][j] = ps.X[i][j] + ps.V[i][j]; /* Transform */ ps.ut[j] = (ps.X[i][j]-ps.blo)/(ps.bup-ps.blo)*(ps.bnd_hi[i]-ps.bnd_lo[i])+ps.bnd_lo[i]; } /* Evaluate Fitness */ ps.fitness = fit(ps.ut); /* Update particle best position */ if(ps.fitness < ps.pbest[i]){ for(j=0;j<MINDV;j++){ ps.p[i][j]=ps.X[i][j]; } ps.pbest[i]=ps.fitness; } /* Update swarm best position */ if(ps.pbest[i] < ps.sbest){ for(j=0;j<MINDV;j++){ ps.g[j]=ps.p[i][j]; } ps.sbest = ps.pbest[i]; printf("%f \n",ps.sbest); } } /* Convergence Criteria */ } /* return(0); */ } 

定义数据结构PS(ps.h)的头文件:

 #ifndef _PS_ #define _PS_ #define MPART 30 #define MINDV 2 typedef struct{ /* Design Space */ double X[MPART][MINDV]; double V[MPART][MINDV]; double p[MPART][MINDV]; double u[MINDV]; double ut[MINDV]; double sbest; double sbest_old; double g[MINDV]; double gt[MINDV]; double pbest[MPART]; double pbest_sort[MPART]; double blo; double bup; double fitness; double maxk; double bnd_lo[MINDV]; double bnd_hi[MINDV]; /* PSO behavior */ int psotype; double w; double phi_p; double phi_g; double gam; double chi; double vred; double rp; double rg; double rr; }PS; /* Dependent Source File Functions */ extern void pso(); extern double fit(double C[2]); #ifndef MAIN extern PS ps; #endif #endif 

最后,我正在使用的make文件:

 CC=gcc CFLAGS= -I. DEPS = ps.h OBJ = main.o pso.o psoi.o fit.o default: program %.o: %.c $(DEPS) $(CC) -c -o $@ $< $(CFLAGS) program: $(OBJ) gcc -o $@ $^ $(CFLAGS) 

在“ps.h”中,你有这条线

 extern PS ps; 

– 但这只声明了 ps (即断言它存在于某个地方); 它没有提供定义 (即使其存在于此处)。 你应该做的是,第一步,更换

 #ifndef MAIN extern PS ps; #endif 

只是

 extern PS ps; 

然后,第二步,进入pso.c并在该文件顶层的某处添加

 PS ps = {}; 

(或PS ps;extern PS ps = {}; )。 如果你的C编译器老了或者笨到足以抱怨空括号,那就写PS ps = {0}; 代替; {}是一个C ++’03-ism,我相信它被收入C’11,但我并不是100%肯定。

简而言之,关于声明的规则是:如果你使用=提供初始化器,那么声明必须是一个定义(因为你怎么能在这里初始化变量?)。 否则,如果你使用了extern存储类,那么它不是一个定义(因为在大多数情况下,你说这个变量存在于该文件的外部 )。 否则,它是一个定义(但在K&R C中它是一个暂定的定义 ,并且许多编译器将默认将它放在BSS部分中,或者提供命令行选项来执行此操作)。

您只将ps 声明extern ,但实际上您从未在任何地方定义它。 写

 PS ps; 

在其中一个C文件中。

链接器输出有点令人困惑,它真的抱怨缺少对象ps的定义。 你已经宣布它是extern ,但从未在任何地方定义它。