未定义对用户定义函数的引用
未定义对用户定义函数的引用
我看到了这个网站上的标准Undefined Reference to线程,但我不认为它解决了我的问题。我没有在我的.cpp
文件上放置头保护,但仍然得到一个对用户定义函数的未定义引用。以下是我的文件:\n(1) pth_funs.h\n
// 线程的问候 void* hello(void* ptr);
\n(2) pth_funs.cpp\n
#includevoid* 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
,因为我相信我已经正确定义并包含了它。我做错了什么?
在代码中,出现了“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分钟,我将把这个答案标记为解决方案。