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

时间:2010-11-09 20:18:38

标签: 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

我在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 );
}

4 个答案:

答案 0 :(得分:5)

  

专业人士如何进行调试   这种问题?

您应该从错误消息开始:

Undefined symbols:"Simulation::runTestEpidSim()"

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

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

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

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

另外......

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

答案 1 :(得分:1)

链接器错误消息表明您没有run * Test * EpidSim的定义,您需要在main中调用此函数。您的描述符合此问题:您已声明此新方法,但您尚未在任何地方实现它。您需要提供此测试函数的实际源代码。

答案 2 :(得分:1)

看起来你声明了功能但没有实现它

答案 3 :(得分:1)

你在哪里定义 runTestEpidSim?您是否在包含main的同一文件中使用正确的签名定义了它?如果它在某个其他文件中定义:您是否在构建过程中包含该文件?

double 
Simulation::runTestEpidSim(void) 
{
     ...
}

您提供的代码仅包含声明,那么定义在哪里?