gpt4 book ai didi

c - 编译时 undefined reference 错误不会消失吗?

转载 作者:行者123 更新时间:2023-11-30 19:44:58 24 4
gpt4 key购买 nike

我正在为类开发一个代理实验室,不明白为什么当我尝试使用 make 编译我的解决方案时,它给了我“对`sem_init'的 undefined reference ”对“Pthread_create”的 undefined reference ...等。它在我的至少 12 或 15 个函数上执行此操作。问题是,它说问题出在csapp.c文件中,但我只能修改并提交proxy.c文件。我正在使用 -lpthread 编译它,并且我读到很多人已经摆脱了这些未定义的错误,因为他们没有使用它。所以我不知道为什么当我使用 -lpthread 标志时仍然遇到这些问题。

有没有人有任何其他我可能遗漏的事情,为什么我会收到这些未定义的引用错误?谢谢

这是我的制作文件:

TEAM = NOBODY
VERSION = 1
HANDINDIR = /afs/cs/academic/class/15213-f02/L7/handin

CC = gcc
CFLAGS = -Wall -g
LDFLAGS = -lpthread

OBJS = proxy.o csapp.o

all: proxy

proxy: $(OBJS)

csapp.o: csapp.c
$(CC) $(CFLAGS) -c csapp.c

proxy.o: proxy.c
$(CC) $(CFLAGS) -c proxy.c

handin:
cp proxy.c $(HANDINDIR)/$(TEAM)-$(VERSION)-proxy.c

clean:
rm -f *~ *.o proxy core

这里只是一些 proxy.c 文件:

#include "csapp.h"
#include "stdlib.h"
#include "pthread.h"
#include "stdio.h"

//Global variables
sem_t mutex;
sem_t log_mutex;

/*
* Function prototypes
*/
int parse_uri(char *uri, char *target_addr, char *path, int *port);
void format_log_entry(char *logstring, struct sockaddr_in *sockaddr, char *uri, int size);
void log_to_file(char * log_entry);
//void handle_request(int *fd);



//WRAPPERS
//Wrapper for rio_readnb that doesn't exit the program
ssize_t Rio_readnb_w(rio_t *rp, void *usrbuf, size_t n)
{
ssize_t rc;
if ((rc = rio_readnb(rp, usrbuf, n)) < 0)
{
printf("ERROR: Rio_readnb failed!\n");
return rc;
}
return rc;
}

//Wrapper for rio_readlineb that doesn't exit the program
ssize_t Rio_readlineb_w(rio_t *rp, void *usrbuf, size_t maxlen)
{
ssize_t rc;
if ((rc = rio_readlineb(rp, usrbuf, maxlen)) < 0)
{
printf("ERROR: Rio_readlineb failed!\n");
return rc;
}
return rc;
}

//Wrapper for rio_writen that doesn't exit the program
void Rio_writen_w(int fd, void *usrbuf, size_t n)
{
if (rio_writen(fd, usrbuf, n) != n)
{
printf("ERROR: Rio_writen failed!\n");
return;
}
}

最佳答案

假设您正在使用 GNU make。

您没有在 makefile 中指定任何链接规则,并且 implicit link rule是:

$(CC) $(LDFLAGS) n.o $(LOADLIBES) $(LDLIBS)

其中 n.o 是您的目标文件。更远; GNU 链接器要求库名称位于应该链接到这些库的目标文件之后,因此如果将 LDFLAGS 更改为 LDLIBS 那么它可能会解决您的问题。

如果您发布 makefile 尝试执行的实际链接命令,这将很有用(这样我们就可以验证是否正在使用此隐式规则)。当然,您可以编写自己的链接规则,而不是依赖隐式规则。

关于c - 编译时 undefined reference 错误不会消失吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27094045/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com