gpt4 book ai didi

使用结构接口(interface)和附加 C 文件在 main 中调用 C 函数

转载 作者:太空宇宙 更新时间:2023-11-03 23:39:22 24 4
gpt4 key购买 nike

我已经将头文件“msg_queue.h”实现到名为“msg_queue.c”的非主文件中。从这里我创建了一个名为“mq_test.c”的主文件,我在其中创建了一个消息队列并调用了在“msg_queue.c”中实现的函数。然而,当我运行“make”命令时,我似乎对每个调用的函数都收到了这个错误:

"enqueue", referenced from:
_main in test.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make: *** [qmsgtest] Error 1

似乎是什么问题,我没有正确实现结构吗?

头文件:

#ifndef MessageQueue_H
#define MessageQueue_H

typedef struct node{
int data;
struct node *next;
} Node;

typedef struct {
Node *front;
Node *rear;
} MessageQueue;

void enqueue(...); // enqueue
...

#endif //MessageQueue_H

实现 header 的文件:

#include "MessageQueue_H.h"

#ifndef MessageQueue_H
#define MessageQueue_H


/* Interface for integer MQueue */
typedef struct node{
int data;
struct node *next;
} Node;

typedef struct {
Node *front;
Node *rear;
} MQueue;

void enqueue(... ){ // enqueue

....

最佳答案

在实现 header 的文件 msg_queue.c 中,您有一个包含保护:

#ifndef MSG_QUEUE_H
#define MSG_QUEUE_H

您在 msg_queue.h 中有一个同名的 include guard,并且由于首先对 header 进行了预处理,因此预处理器删除了实现代码(因为 MSG_QUEUE_H 是已经定义,你的 include guard 正在删除实现代码),这就是它找不到符号的原因。

您可以通过在源代码上使用 -E 选项运行 gccclang 来自行检查。它会告诉你预处理器对你的代码做了什么(在你的例子中这意味着你只得到函数的原型(prototype),而不是实现)。

因此您需要删除 .c 源文件中的 include guard。

It's worth noting that include guards aren't normally needed in .c implementation files, as these normally aren't included from other files.

在您的示例中,您还定义了两次结构类型(在头文件和 C 文件中)。这违反了单一定义规则,所以如果你想用头文件中的数据类型定义你的接口(interface),你应该从源文件中删除它们,否则将无法编译。

There are other errors in this code which prevent it from compiling (at least in C99 mode which is what I've tested it as), but these are unrelated to your problem with the linker not being able to find the function symbol(s).

关于使用结构接口(interface)和附加 C 文件在 main 中调用 C 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49969424/

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