繁体   English   中英

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中处理过“更大/多文件”项目。

编辑
已经向我指出,包含主要功能的源文件确实在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;
}

希望这可以使其他人避免犯同样的天真错误。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM