C “固定”;未定义的引用;ft.makefile.txt和pthreads

C “固定”;未定义的引用;ft.makefile.txt和pthreads,c,makefile,pthreads,linker-errors,C,Makefile,Pthreads,Linker Errors,所以,我正在开发一个多线程程序,我已经准备好编译,但我遇到了我认为是链接器错误的情况 我确信我的所有文件都包括我的头文件,并且我已经正确地将有问题的变量外部化了。然而,我仍然认为头文件有一个我没有看到的问题。makefile也可能扮演一个角色 这是我的makefile。我是一个新手,这里最大的问题是我是否正确地包含了pthread库。(我在Linux服务器上使用GNU): 头文件的相关部分: extern FILE *dic; extern FILE *logFile; extern pthre

所以,我正在开发一个多线程程序,我已经准备好编译,但我遇到了我认为是链接器错误的情况

我确信我的所有文件都包括我的头文件,并且我已经正确地将有问题的变量外部化了。然而,我仍然认为头文件有一个我没有看到的问题。makefile也可能扮演一个角色

这是我的makefile。我是一个新手,这里最大的问题是我是否正确地包含了pthread库。(我在Linux服务器上使用GNU):

头文件的相关部分:

extern FILE *dic;
extern FILE *logFile;
extern pthread_mutex_t workLock, logLock;
extern pthread_cond_t workCond, logCond;
初始化(在simpleServer.c中):


很抱歉出现代码墙,但我花了3个小时没有取得任何进展,我非常希望看到我犯下的所有编译器错误。

事实上,您的初始化包括函数调用:

pthread_mutex_t workLock, logLock;
pthread_cond_t workCond, logCond;
FILE *logFile = fopen("log.txt", "w");
FILE *dic = fopen(argv[2], "r");
似乎暗示这段代码在一个函数中。这意味着这些实际上是包含它们的函数的局部变量,而不是头文件中声明的
extern
变量的定义

相反,您应该在一个.c文件的文件范围内(在任何函数之外)定义这些变量:

然后在函数中可以调用
fopen()
,但引用全局变量而不是声明新的局部变量:

logFile = fopen("log.txt", "w");
dic = fopen(argv[2], "r");

您仍然需要在Makefile中使用正确的链接顺序-依赖于extern对象的.o文件必须位于定义该对象的.o文件之前。

您的初始化包括函数调用这一事实:

pthread_mutex_t workLock, logLock;
pthread_cond_t workCond, logCond;
FILE *logFile = fopen("log.txt", "w");
FILE *dic = fopen(argv[2], "r");
似乎暗示这段代码在一个函数中。这意味着这些实际上是包含它们的函数的局部变量,而不是头文件中声明的
extern
变量的定义

相反,您应该在一个.c文件的文件范围内(在任何函数之外)定义这些变量:

然后在函数中可以调用
fopen()
,但引用全局变量而不是声明新的局部变量:

logFile = fopen("log.txt", "w");
dic = fopen(argv[2], "r");

您仍然需要在Makefile中使用正确的链接顺序-依赖于extern对象的.o文件必须位于定义该对象的.o文件之前。

否,它们是用
extern pthread\u mutex\t workLock、logLock。您仍然需要找出它们是在哪里定义的(定义似乎缺失),而没有extern关键字。@Ctx我在simpleServer.c中定义了它们,这就是我在c文件中初始化的意思。它们的定义方式与它们的声明方式相同,只是没有外部变量。也许值得一提的是,simpleServer.c使用dic、workLock和workCond,这些都不会显示为未定义的引用。是的,错误消息描述了链接错误。它们似乎与pthread没有特别的关系。不清楚为什么在makefile中使用双冒号规则。我不认为这是问题所在,但双冒号规则是一个模糊的GNU ism。除非你确切地了解它们的用途以及你想要它们的原因,否则不要使用它们。只需将双冒号改为单冒号。尽管如此,错误消息似乎与您对代码的描述不一致。除非您演示问题,否则我们不可能提供帮助。不,它们是用
extern pthread\u mutex\t workLock,logLock。您仍然需要找出它们是在哪里定义的(定义似乎缺失),而没有extern关键字。@Ctx我在simpleServer.c中定义了它们,这就是我在c文件中初始化的意思。它们的定义方式与它们的声明方式相同,只是没有外部变量。也许值得一提的是,simpleServer.c使用dic、workLock和workCond,这些都不会显示为未定义的引用。是的,错误消息描述了链接错误。它们似乎与pthread没有特别的关系。不清楚为什么在makefile中使用双冒号规则。我不认为这是问题所在,但双冒号规则是一个模糊的GNU ism。除非你确切地了解它们的用途以及你想要它们的原因,否则不要使用它们。只需将双冒号改为单冒号。尽管如此,错误消息似乎与您对代码的描述不一致。除非你提出解决问题的建议,否则我们不可能提供帮助。
pthread_mutex_t workLock = PTHREAD_MUTEX_INITIALIZER, logLock = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t workCond = PTHREAD_COND_INITIALIZER, logCond = PTHREAD_COND_INITIALIZER;
FILE *logFile, *dic;
logFile = fopen("log.txt", "w");
dic = fopen(argv[2], "r");