Kyle
Kyle

Reputation: 217

Undefined reference to function during linking

I am getting a linking error (undefined reference) when I try to link my code and I can't figure out why.

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

The error I get tells me the "step(...) function in main.cpp is undefined.

So...the code for main() looks something like this(I left off the includes, but it does include the header with the step() function, which is obvious since I had no compile errors):

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;
}

And the step function can be found in 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);
}

The header definition:

#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

I am clearly linking the files together (and the order has no effect). I am not having this issue with any other function that is called from main.cpp and defined within another .cpp file (and commenting out the call to step() causes no errors at all). Any ideas what might be causing this issue?

Upvotes: 0

Views: 1409

Answers (1)

Rocky Pulley
Rocky Pulley

Reputation: 23301

looks like you're missing an & in your definition. Check verlet_celllist

Upvotes: 2

Related Questions