我对编译错误很困惑。我的代码在4-5小时前完成了工作;沿途唯一可行的检查点没有产生任何线索(即,我无法在一个中间步骤中使错误消失)。我没有看到编译器错误如何与我所做的任何更改有关。
使用。编译
g++ -O3 -o a.out -I /Applications/boost_1_42_0/ Host.cpp Simulation.cpp main.cpp Rdraws.cpp SimPars.cpp
出现以下错误
Undefined symbols:
"Simulation::runTestEpidSim()", referenced from:
_main in ccmcSY5M.o
ld: symbol(s) not found
collect2: ld returned 1 exit status
我在Simulation
中创建和操作main
个对象。我对代码的唯一更改是(1)创建一个新的成员函数Simulation::runTestEpidSim()
,在main
中调用,以及(2)编写一些新的全局输入/输出处理函数,我自从打开并直接插入main
以便调试正在进行的操作。
我没有更改任何cpp文件,包含,头文件,库或编译器命令。
我不是专业的程序员。专业人士将如何调试此类问题?
不确定如何最好地剪切和粘贴我的代码,但这是摘录 -
class Simulation
{
public:
Simulation( int trt, int sid, SimPars * spPtr );
~Simulation();
// MEMBER FUNCTION PROTOTYPES
void runDemSim( void );
void runEpidSim( void );
double runTestEpidSim( void );
...
}
int main() {
for ( int trt = 0; trt < NUM_TREATMENTS; trt++ ) {
double treatment = TREATMENTS[ trt ];
....
cout << "Treatment #" << trt + 1 << " of " << NUM_TREATMENTS << ":" << endl;
int matchAttempts = 0;
double prevError = 1.0 + PREV_ERROR_THOLD;
double thisBeta = 0.0;
while ( matchAttempts < MAX_MATCH_ATTEMPTS && prevError > PREV_ERROR_THOLD ) {
cout << " Attempt #" << matchAttempts + 1;
SimPars thesePars;
SimPars * spPtr = &thesePars;
Simulation thisSim( trt, 1, spPtr );
thisSim.runDemSim();
prevError = thisSim.runTestEpidSim() - TARGET_PREV;
cout << ", error=" << prevError << endl;
if ( prevError > PREV_ERROR_THOLD ) {
....
return 0;
}
我之前一直在执行runEpidSim()
没问题。
更新
我有完整的Simulation::runTestEpidSim()
实现代码 - 我不知道如何最好地呈现这个!
double Simulation::runTestEpidSim( void ) {
if ( allHosts.size() == 0 ) {
cerr << "No hosts remaining for epidemiological simulation. Cancelling." << endl;
assert(false);
}
cout << " Entering test simulation at t=" << demComplete << "." << endl;
double percentDone = 0.0;
// Initialize host population with infections
demOutputStrobe = t;
epidOutputStrobe = t;
seedInfections();
EventPQ::iterator eventIter = currentEvents.begin();
double nextTimeStep = t + EPID_DELTA_T;
double prevalences[ NUM_TEST_SAMPLES ]; // holds prevalences at strobing periods
for ( int p = 0; p < NUM_TEST_SAMPLES; p++ ) {
prevalences[ p ] = 0.0;
}
double prevYear = DEM_SIM_LENGTH + TEST_EPID_SIM_LENGTH - NUM_TEST_SAMPLES; // first simulation year to start sampling
int prevSamples = 0;
while ( t < TEST_EPID_SIM_LENGTH + demComplete )
{
#ifdef DEBUG
cout << "time step = " << t << " (" << allHosts.size() << " hosts; " << currentEvents.size() << " events queued)" << endl;
assert( currentEvents.size()>0);
#endif
// Calculate new infections for every host and add events to stack
#ifdef DEBUG
cout << "Adding infections for this time step: " << endl;
#endif
calcSI();
eventIter = currentEvents.begin();
#ifdef DEBUG
cout << "Executing events off stack (currentEvents.size()=" << currentEvents.size() << "): " << endl;
#endif
while ( ( *eventIter ).time < nextTimeStep ) {
while ( demOutputStrobe < t ) {
writeDemOutput();
demOutputStrobe += STROBE_DEM;
}
while ( epidOutputStrobe < t ) {
writeEpidOutput();
epidOutputStrobe += STROBE_EPID;
}
if ( prevYear < t ) {
prevalences[ prevSample ] = calcPrev();
cout << "\tOutputting prevalence sample #" << prevSamples+1 << "; prevalence under 5 is " << prevalences[ prevSample ] << endl;
prevSample++;
}
while ( percentDone/100.0 < ( t - demComplete )/EPID_SIM_LENGTH ) {
cout << "\t" << percentDone << "% of this test component complete." << endl;
percentDone += PROGRESS_INTERVAL;
}
// Execute events off stack
Event thisEvent = *eventIter;
#ifdef DEBUG
assert( thisEvent.time >= t );
if ( thisEvent.time < t ) {
cout << "Trying to execute event scheduled for time " << thisEvent.time << ", though sim time is " << t << endl;
assert( thisEvent.time >= t );
}
#endif
t = thisEvent.time;
#ifdef DEBUG
cout << "\tt=" << t << endl;
// cout << "\tAbout to execute event ID " << (*eventIter).eventID << " at time " << (*eventIter).time << " for host ID " << (*eventIter).hostID << endl;
cout << "\tAbout to execute event ID " << thisEvent.eventID << " at time " << thisEvent.time << " for host ID " << thisEvent.hostID << endl;
#endif
executeEvent( thisEvent );
eventCtr++;
currentEvents.erase( eventIter ); // Check that if event added to top of currentEvents, will not invalidate itr
eventIter = currentEvents.begin();
#ifdef DEBUG
cout << "\tcurrentEvents.size() after pop is " << currentEvents.size() << endl;
#endif
}
t = nextTimeStep;
nextTimeStep += EPID_DELTA_T;
}
double meanPrev = 0.0;
double sumPrev = 0.0;
int totSamples = 0;
for ( int p = 0; p < NUM_TEST_SAMPLES; p++ ) {
if ( prevalences[ p ] > 0 ) { // in cae
sumPrev += prevalences[ p ];
totSamples++;
}
}
cout << "Counted " << totSamples << " total prevalence samples." << endl;
meanPrev = sumPrev/(double)totSamples;
return( meanPrev );
}
答案 0 :(得分:5)
专业人士如何进行调试 这种问题?
您应该从错误消息开始:
Undefined symbols:"Simulation::runTestEpidSim()"
你已经为runTestEpidSim添加了一个原型,但是你没有显示这个函数的定义(可能它应该在Simulation.cpp中)
这就是我要寻找的,开始......
<强>更新强> 感谢您发布定义。你发布的内容看起来很好,并通过了上面的前四个测试 - 但你可以看到一个不匹配的#ifdef DEBUG如何为你搞砸了......
另外......
答案 1 :(得分:1)
链接器错误消息表明您没有run * Test * EpidSim的定义,您需要在main中调用此函数。您的描述符合此问题:您已声明此新方法,但您尚未在任何地方实现它。您需要提供此测试函数的实际源代码。
答案 2 :(得分:1)
看起来你声明了功能但没有实现它
答案 3 :(得分:1)
你在哪里定义 runTestEpidSim
?您是否在包含main
的同一文件中使用正确的签名定义了它?如果它在某个其他文件中定义:您是否在构建过程中包含该文件?
double
Simulation::runTestEpidSim(void)
{
...
}
您提供的代码仅包含声明,那么定义在哪里?