与g++链接时对函数的未定义引用

Undefined reference to a function when linking with g++

本文关键字:未定义 引用 函数 g++ 链接      更新时间:2023-10-16

我试图链接几个目标文件,我得到3个未定义的引用函数错误。

inputtest.cpp

//test of input methods
#include <iostream>
#include <string>
#include <fstream>
#include <string>
#include <vector>

#include "Vector.h"
#include "Particle.h"
#include "read_particle_input.h"
#include "User_input.h"
#include "Particle_vector.h"
using namespace std;
using namespace berger_DEM;
int main() {
    Particle_vector particles;
    User_input input_data;
    read_particle_input(particles, input_data);
    cout <<endl<< particles.getpart(1).rho()<<endl<<particles.getpart(1).radius()<<endl;
    return 0;
}

我将它与5个对象文件链接,这些文件的名称在"。h"文件中找到(只是从同名的。cpp文件编译的。o文件)。我收到的错误之一是

未定义引用'berger_DEM::read_particle_input(berger_DEM::Particle_vector&, berger_DEM::User_input&)

注意,这个函数在read_particle_input.h中有一个原型,并在read_particle_input.o中实现。我也得到了另外两个未定义的引用,但我相信它们是相同的问题,如果我能解决这个问题,同样的解决方案应该适用于这两个。

原型:

namespace berger_DEM
{   
    void read_particle_input(Particle_vector&,User_input&);
}

实现://方法读取

void read_particle_input(Particle_vector & particles, User_input & input_data) 
{
    //define local variables
    Vector velocity_in;
    Vector position_in;
    double radius_in;
    double rho_in;

    //open file and define file pointer
    std::ifstream particle_input ("particle_input.dat");
    //go through each line in particle_input.dat and define each particle
    if (particle_input.is_open()) {
        for(int i=0;i<input_data.num_particles();i++) {
            //read one line from particle_input.dat
            particle_input >> position_in;
            particle_input >> radius_in;
            particle_input >> rho_in;
            particle_input >> velocity_in;
            //set particle properties and position/velocity
            particles.getpart(i).setrho(rho_in);
            particles.getpart(i).setradius(radius_in);
            particles.getpart(i).move(position_in);
            particles.getpart(i).accelerate(velocity_in);
        }
    }
    //close file
    particle_input.close();
}

我一直在寻找有同样问题的人,但我找不到任何东西。谢谢你的帮助。

您的实现缺少类作用域。

改变
void read_particle_input(Particle_vector & particles, User_input & input_data) 
{
    //define local variables

void berger_DEM::read_particle_input(Particle_vector & particles, User_input & input_data) 
{
    //define local variables

在实现文件中应该定义为,

void berger_DEM::read_particle_input(Particle_vector& particles, User_input& input_data);
{//  ^^^^^^^^^^^ specify that 'read_particle_input' is part of the namespace
  //...
}