C++编译器错误:找不到从_main引用的成员函数的ld:符号

Sar*_*rah 1 c++ compiler-construction

我对编译器错误很困惑.我的代码在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
Run Code Online (Sandbox Code Playgroud)

我在中创建和操作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;
}
Run Code Online (Sandbox Code Playgroud)

我以前执行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 );
}
Run Code Online (Sandbox Code Playgroud)

Rod*_*ddy 5

专业人士将如何调试此类问题?

您应该从错误消息开始:

Undefined symbols:"Simulation::runTestEpidSim()"
Run Code Online (Sandbox Code Playgroud)

你已经为runTestEpidSim添加了一个原型,但你没有显示这个函数的定义(可能它应该在Simulation.cpp中)

这就是我要寻找的,开始......

  • 你有没有定义它?
  • 您是否将其定义为Simulation类的成员?
  • 您是否使用完全相同的参数定义了它?
  • 您是否使用完全相同的返回类型定义了它?
  • 该定义是否被意外评论或#ifdef出?

更新 感谢您发布定义.你发布的内容看起来很好,并通过了上面的前四个测试 - 但你可以看到一个不匹配的#ifdef DEBUG如何为你搞砸了......

此外...

  • 您是否实际编译并链接了包含该定义的文件?