Visual studio C 编译器没有将头文件链接到对应的源文件

Visual studio C compiler not linking header file to its source counterpart

我正在使用 VS 并在 C 中使用我的第一块可重用代码,所以我将我的代码分成头文件和源文件,这导致了一些意外行为。

在我看来,不知何故,链接器无法解析我的类型定义结构。我试过将实际的结构声明移动到实现文件中,并从头文件中对结构进行类型定义,但没有成功。

为了简洁起见,我删除了所有实现,因为这不是问题所在。

// queue.h
#ifndef INC_QUEUE_
#define INC_QUEUE_

#include <stdint.h>

// STRUCT TYPEDEF
typedef struct QueueElement { ... } QueueElement;
typedef struct Queue { ... } Queue;

// FUNCTION PROTOTYPES
Queue* queue_construct();
uint32_t queue_peek(Queue *);
void queue_enqueue(Queue *, uint32_t);
uint32_t queue_dequeue(Queue *);
uint8_t queue_empty(Queue *);
void queue_destroy(Queue *);

#endif


// queue.c
#include <stdlib.h>
#include "queue.h"

Queue* queue_construct() { ... }
uint32_t queue_peek(Queue *queue) { ... }
void queue_enqueue(Queue *queue, uint32_t element) { ... }
uint32_t queue_dequeue(Queue *queue) { ... }
uint8_t queue_empty(Queue *queue) { ... }
void queue_destroy(Queue *queue) { ... }

源代码都很好,都可以编译,但是当我尝试将其包含在例如这个文件...

#include <stdio.h>
#include "queue.h"

int main()
{
  Queue *q = queue_construct();
  queue_destroy(q);
  return 1;
}

我的链接器一直给我的错误:

error LNK2019: unresolved external symbol "struct Queue * __cdecl queue_construct(void)" (?queue_construct@@YAPAUQueue@@XZ) referenced in function _main
error LNK2019: unresolved external symbol "void __cdecl queue_destroy(struct Queue *)" (?queue_destroy@@YAXPAUQueue@@@Z) referenced in function _main

任何帮助将不胜感激,这可能是一个愚蠢的问题,但正如我所说,我从未在 VS C 中处理过 "larger/multifile" 项目。

编辑
有人向我指出,包含主要功能的源文件确实在 cpp 源文件中,但我的头文件和实现在 C 文件中。据我所知,您可以在 C++ 代码中的任何位置使用 C 文件,一个例子就是能够在 C++ 中使用任何 C 系统库。

该程序现在运行良好,但现在我的问题是:为什么我不能在 cpp 文件中使用 C 头文件?为什么这里会这样。显然我遗漏了一些重要的东西。

在一些评论的帮助下,问题是我的主程序是在 cpp 文件中编写的,并且包含我自己的 c 头文件。愚蠢的是,我不知道你不能简单地在 C++ 中使用 C 库。

简单地将主文件转换为 C 源文件即可解决问题。

这不是我需要的,因为我需要我的源文件在 C++ 中,所以只需搜索一下,解决方案就很简单。我只需要像这样更改我的主 cpp 源文件:

// main.cpp
#include <stdio.h>

extern "C" {
  #include "queue.h"
}

int main()
{
  Queue *q = queue_construct();
  queue_destroy(q);
  return 1;
}

希望这能阻止其他人犯我犯过的同样天真的错误。