将C函数在MAIN中使用结构接口和其他C文件



我已经在一个名为" msg_queue.c"的非墨件文件中实现了一个标题文件," msg_queue.h"。从这里,我创建了一个称为" 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

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

headerFile:

#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

实现标题的文件:

#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
  ....

在实现标头的文件中

#ifndef MSG_QUEUE_H
#define MSG_QUEUE_H

您有一个包含的守卫,在msg_queue.h中具有相同名称,并且首先对标头进行预处理,因此预处理程序将删除实现代码(因为MSG_QUEUE_H已经定义了CC_3,您的Incluber Guard是删除实现代码(,这就是为什么它找不到符号。

您可以通过在源代码上使用-E选项运行gccclang来自己检查一下。它将向您展示预处理器对您的代码所做的工作(在您的情况下,这意味着您仅获得功能的原型,而不是实现的实现(。

因此,您需要在.c源文件中删除Include Guard。

值得注意的是,.c实现文件中通常不需要包括警卫,因为这些通常不包括其他文件中的

在您的示例中,您还定义了两次结构类型(在标题和C文件中(。这违反了单个定义规则,因此,如果要使用标题中的数据类型定义接口,则应将其从源文件中删除,否则不会编译。

此代码中还有其他错误可以防止其编译(至少在C99模式下,这是我对其进行测试的(,但是这些与您的问题无关,而链接器无法找到函数符号(S(。

相关内容

  • 没有找到相关文章

最新更新