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;
}
希望这能阻止其他人犯我犯过的同样天真的错误。
我正在使用 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;
}
希望这能阻止其他人犯我犯过的同样天真的错误。