我在编译/链接以下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 pson"); pso(); printf("finished pson"); 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
,但从未在任何地方定义它。
以上就是c/c++开发分享未定义的引用’_ *’链接器错误相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/c-cdevelopment/522443.html