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

16 浏览
0 Comments

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

我看到了这个网站上的标准Undefined Reference to线程,但我不认为它解决了我的问题。我没有在我的.cpp文件上放置头保护,但仍然得到一个对用户定义函数的未定义引用。以下是我的文件:\n(1) pth_funs.h\n

// 线程的问候
void* hello(void* ptr);

\n(2) pth_funs.cpp\n

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

\n(3) structs.h\n

#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

\n(4) fio.h\n

#ifndef FIO_H
#define FIO_H
#include 
#include 
#include "structs.h"
void read_grd(std::string, grd_str);
#endif

\n(5) fio.cpp\n

#include 
#include "structs.h"
#include "fio.h"
void read_grd( std::string fname, grd_str &grd)
{
  grd.nx = 10;
  grd.ny = 10;
}

\n(6) 最后,xdriver.cpp\n

#include  // 用于cout,endl等
using namespace std; // 用于cout,endl等
#include  // 用于pthreads
#include  // 字符串处理
#include "pth_funs.h" // pthread函数头
#include "structs.h"
#include "fio.h"
int main(int argc, char** argv)
{
  // 线程内容
  int nthreads = 4;
  pthread_t rank[4];
  int iret[4];
  // 文件内容
  string base_dir = "D:\\cygwin64\\home\\Robert\\code\\C\\form_reconstruction\\data\\";
  string fname;
  // 拓扑结构内容
  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 << "文件名:" << fname << endl;
  read_grd(fname, grd);
}

\n我使用的Makefile如下进行编译:\n

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

\n然而,在编译时我得到了以下错误:\n

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, std::allocator >, grd_str)'
collect2: ld returned 1 exit status
make: *** [create_grd.exe] Error 1

\n但我不知道为什么我的主函数找不到read_grd,因为我相信我已经正确定义并包含了它。我做错了什么?

0
0 Comments

在代码中,出现了“Undefined reference to a user defined function”这个问题。出现这个问题的原因是在声明和定义read_grd函数时,参数不匹配。一个函数的第二个参数是grd_str,而另一个函数的第二个参数是grd_str&。由于xdriver.cpp包含了fio.h头文件,它看到并尝试使用前一个函数,但链接器找不到任何关于它的定义。你可能想要在fio.h中更改声明为:

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

现在,这个函数的定义由fio.cpp提供。

这是一个完美的解决方案。我已经好几年没有写C++了,所以我正在努力恢复。再过8分钟,我将把这个答案标记为解决方案。

0