2012-03-30 3 views
0

Я получаю ошибку связывания (неопределенная ссылка), когда я пытаюсь связать свой код, и я не могу понять, почему.Неопределенная ссылка на функцию во время связывания

I am linking using the following command: 
mpic++ -Wl,-V main.o Particle.o Particle_forces.o User_input.o output.o time_step_Gear_Verlet.o Verlet_variables.o -o DEM.exe -Lboost_mpi.a -Lboost_serialization.a 

Я получаю ошибку говорит мне, что функция «шаг (...) в main.cpp неопределен.

... Так что код для основной() выглядит примерно так (я оставил выключения включает в себя, но он включает заголовок с функцией шага(), которая очевидна, так как я не имел никаких ошибок компиляции):

int main() 
{ 

//do some stuff 


for(int i=0;i<input_data.nstep();i++) 
{ 
    //call step() to do all calculations necessary for a particular timestep 
    step(particles, safe_particles, particle_properties, particle_forces, input_data, verlet_list, verlet_celllist, coll_eros_track, tan_contact_histories, collision_number_part); 

    //do some more stuff 
} 


return 0; 
} 

И ступенчатую функцию можно найти в time_step_Gear_Verlet.cpp:

void step(std::vector<Particle> & particles, std::vector<Particle> & safe_particles, std::vector<Particle_props> & particle_properties, std::vector<Particle_forces> & particle_forces, User_input& input_data, std::vector<std::set<int> > & verlet_list, vector<vector<vector<vector<int> > > > verlet_celllist, data_tracking & coll_eros_track, vector<map<int,Vector> > & tan_contact_histories, vector<int> & collision_number_part) 
{ 
    //define booleans used for checking what to do 
    //newverlet states whether the verlet lists are currently new and ok will be the output to make_verlet 
    bool ok=true, newverlet=false; 

    if(input_data.collisions_on()) 
    { 
     //uses verlet_needs_update() to see if the verlet lists need to be updated 
     if(verlet_needs_update(particles, safe_particles, input_data)) 
     { 
      //if the lists need to be updated then a call to make_verlet is made to make new lists and output is stored in "ok" 
      ok=make_verlet(particles, particle_properties, input_data, verlet_celllist, verlet_list); 

      //since new lists have been made, newverlet becomes true 
      newverlet=true; 
     } 

     //if something went wrong when the new lists were made, then a restoration has to be made 
     if(!ok) 
     { 
      cout<<"verlet list construction failed due to particles already touching. Try changing the verlet distance"<<endl; 
      exit(1); 
     } 

     //if the lists are new and make_verlet worked fine, then store current particle values 
     if (newverlet && ok) 
     { 
      //store current particle and time values 
      safe_particles=particles; 
     } 
    } 
    //call integrate() to integrate the equations of motion 
    integrate(particles, particle_properties, particle_forces, input_data, verlet_list, coll_eros_track, tan_contact_histories, collision_number_part); 
} 

Определение заголовка:

#ifndef time_step_Gear_h 
#define time_step_Gear_h 

#include <vector> 
#include <map> 
#include <set> 

#include "Particle.h" 
#include "Particle_props.h" 
#include "Particle_forces.h" 
#include "User_input.h" 
#include "data_tracking.h" 

void step(std::vector<Particle> &, std::vector<Particle> &, std::vector<Particle_props> &, std::vector<Particle_forces> &, User_input&, std::vector<std::set<int> > &, std::vector<std::vector<std::vector<std::vector<int> > > > &, data_tracking &, std::vector<std::map<int,Vector> > &, std::vector<int> &); 
void make_forces(std::vector<Particle> &, std::vector<Particle_props> &, std::vector<Particle_forces> &, User_input&, std::vector<std::set<int> > &, data_tracking &, std::vector<std::map<int,Vector> > &, std::vector<int> &); 
void integrate(std::vector<Particle> &, std::vector<Particle_props> &, std::vector<Particle_forces> &, User_input&, std::vector<std::set<int> > &, data_tracking &, std::vector<std::map<int,Vector> > &, std::vector<int> &); 
void init_algorithm(std::vector<Particle> &, vector<Particle> & safe_particles, std::vector<Particle_props> &, User_input&, std::vector<std::vector<std::vector<std::vector<int> > > > &, std::vector<std::set<int> > &); 


#endif 

Я четко увязываются файлы вместе (и порядок не имеет никакого эффекта). У меня нет этой проблемы с любой другой функцией, которая вызывается из main.cpp и определена в другом .cpp-файле (и комментирование вызова метода step() не вызывает ошибок вообще). Какие идеи могут вызвать эту проблему?

+0

Вы на 100% уверены, что подпись функции шага соответствует его заголовку и его реализации? – Mat

+0

Да, я добавлю его выше, но он был скопирован с момента его создания. – Kyle

ответ

1

похоже, что в вашем определении отсутствует &. Проверить verlet_celllist

+0

Ничего себе ... спасибо. Наверное, я изменил что-то, вставив его. – Kyle