未定义的用户定义函数引用

时间:2014-01-14 20:12:42

标签: c++ makefile include undefined-reference

我已经看过这个网站的标准Undefined Reference to帖子,但我不相信它解决了我的问题。我没有在我的.cpp文件上添加标题保护,但仍然获得对用户定义函数的未定义引用。这是我的文件:

(1)pth_funs.h

// hello from thread <pid>
void* hello(void* ptr);

(2)pth_funs.cpp

#include <stdio.h>

void* hello(void *ptr)
{
  char *message;
  int pid = (long) ptr;
  printf("Hello from thread %i\n", pid);
}

(3)structs.h

#ifndef STRUCTS_H
#define STRUCTS_H
struct grd_str {
  long nx;
  long ny;
  long natoms;
  char** atnames;
  double* xs;
  double* ys;
  double** fs;
  double** xyzs;
};
#endif

(4)fio.h

#ifndef FIO_H
#define FIO_H
#include <iostream>
#include <string.h>
#include "structs.h"

void read_grd(std::string, grd_str);

#endif

(5)fio.cpp

#include <string.h>
#include "structs.h"
#include "fio.h"

void read_grd( std::string fname, grd_str &grd)
{
  grd.nx = 10;
  grd.ny = 10;
}

(6)最后,xdriver.cpp

#include <iostream> // needed for cout, endl, etc
using namespace std; // needed for cout, endl, etc
#include <pthread.h> // needed for pthreads
#include <string.h> // string handling

#include "pth_funs.h" // pthread function headers
#include "structs.h"
#include "fio.h"

int main(int argc, char** argv)
{
  // thread stuff
  int nthreads = 4;
  pthread_t rank[4];
  int iret[4];

  // file stuff
  string base_dir = "D:\\cygwin64\\home\\Robert\\code\\C\\form_reconstruction\\data\\";
  string fname;

  // topology stuff
  int nx, ny;
  double* xs;
  double* ys;
  double** fs;
  grd_str grd;

  for(long tid = 0; tid < nthreads; tid++)
  { iret[tid] = pthread_create( &rank[tid], NULL, hello, (void*) tid); }

  fname = base_dir;
  fname.append("adf\\adf.6.grd");
  cout << "Filename: " << fname << endl;

  read_grd(fname, grd);
}

我正在使用Makefile编译它,如下所示:

cc=g++
exe=create_grd.exe

flags=-pthread
hds= pth_funs.h fio.h structs.h
objs= pth_funs.o fio.o

all: create_grd.exe

create_grd.exe: xdriver.cpp $(hds) $(objs)
  $(cc) -o $(exe) $(objs) xdriver.cpp

pth_funs.o: pth_funs.cpp pth_funs.h
  $(cc) -c pth_funs.cpp $(flags)

fio.o: fio.cpp fio.h
  $(cc) -c fio.cpp $(flags)

clean:
  rm -rf *.o

然而,在编译时我得到了

g++ -c pth_funs.cpp -lpthread
g++ -c fio.cpp -lpthread
g++ -o create_grd.exe pth_funs.o fio.o xdriver.cpp -lpthread
/tmp/ccdaBayB.o: In function `main':
xdriver.cpp:(.text+0x16f): undefined reference to `read_grd(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, grd_str)'
collect2: ld returned 1 exit status
make: *** [create_grd.exe] Error 1

但我不知道为什么我的主程序找不到read_grd,因为我相信我正确地定义并包含它。我做错了什么?

1 个答案:

答案 0 :(得分:1)

read_grd的声明和定义没有匹配的参数。一个采用grd_str作为其第二个参数,另一个采用grd_str&。由于xdriver.cpp包含fio.h,它会看到并尝试使用前一个函数,但链接器无法在任何地方找到它的定义。您可能希望将fio.h中的声明更改为:

void read_grd(std::string, grd_str&);

现在,fio.cpp提供了此功能的定义。