【问题标题】:LNK 2001: Unresolve external symbol struct **LNK2001:未解析的外部符号结构**
【发布时间】:2015-10-03 23:55:20
【问题描述】:
#include "stdafx.h"
#include <ctype.h>
#include <limits.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <string.h>

//typedef struct kvNode kvNode;

struct kvNode
{
    char cKey[32];
    uint32_t iValue;
    struct kvNode *NEXT;
};

//Function declarations
void put(char *key[], int *value);
uint32_t get(char *key[]);
int del(char *key[]);
uint32_t hashkey(char *key);
void strUpper(char *);

const int arraylen = 10; //length of key array
kvNode *keys[]; //our key array

int main()
{
    //Create array of pointers to kvNodes
    keys[arraylen] = { NULL };
    return 0;
}

我很确定这是返回错误的代码块。该错误发生在构建期间,并且是:

1>keyValue.obj : error LNK2001: unresolved external symbol "struct kvNode * * keys" (?keys@@3PAPAUkvNode@@A)

我想做的是在 C 中练习键值存储(毫无疑问,使用更多,容我们说,宽松语言最近让我的 C 刀变钝了),所以我定义了一个键值node 结构,然后是指向这些节点的指针数组。在 SO 上关于前向声明结构的其他问题之后,我得到了在结构内部声明指向结构的指针的语法,但由于某种原因,编译器(Vis Studio)在一个未解析的外部符号上咳嗽,我不知道为什么。

【问题讨论】:

  • 这一行:kvNode *keys[]; //our key array 是否与您编译程序时一样?您在该行上方使用 typedef 进行了注释,因此该行应该是 struct kvNode *keys[]; //our key array,但随后您的链接器会发出一个关于 struct kvNode **keys 的错误,该错误在您的源代码中不存在。那么,这是产生错误的实际代码吗?
  • 是的,克里斯明白了,编译器需要知道数组的大小,这是有道理的,但我的程序必须朝着不同的方向发展。

标签: c struct key-value key-value-coding


【解决方案1】:

你需要为这个数组声明一个大小kvNode *keys[]; //our key array

如果在编译时不知道大小,编译器如何编译它?它被声明为具有静态生命周期,因此必须给它一个固定的大小,一个固定的二进制内存块。我认为编译器将上述行解释为声明而不是定义,因此出现链接错误。

【讨论】:

  • 有道理,也许我需要问一个单独的问题,但是如果在程序运行之前不知道大小怎么办?
  • 好吧,在这种情况下,您应该使用 malloc 在堆上分配它,或者如果您的编译器支持可变长度数组,您可以在堆栈上分配它(作为函数中的局部变量)。你没有说你正在使用什么标准的 C。
  • 是的,成功了,显然可以在 9 分钟内接受。我必须看看默认情况下会编译什么标准 Vis Studio,但这为我指明了正确的方向,谢谢。
  • @BigHomie 那么你不能让它成为一个全局数组。通常,您会在运行时分配数组(使用malloc)并有一个指向它的第一个元素的全局指针。
  • @immibis 听起来像我要走的路。
【解决方案2】:

这是一个编译时间问题,而不是链接时间问题。用这一行:

kvNode *keys[];

这有几个问题。

首先,语法不正确:。应该是:

struct kvNode *keys[];

但这并不能处理下一行,因为编译器将默认仅使用单个项目大小的键[]

keys[arraylen] = { NULL };

建议:

struct kvNode *keys[ arraylen ];

即便如此,这一行:

keys[arraylen] = { NULL };

正在尝试设置超出指针数组末尾的键[10]。因为在 C 中,数组索引从 0 而不是 1 开始,所以 keys[] 的有效索引是 0...9

强烈建议在编译时始终启用所有警告,然后修复这些警告。

强烈建议将编译步骤与链接步骤分开执行,以便您可以轻松确定哪个步骤实际上包含问题的根源

【讨论】:

    猜你喜欢
    • 2020-04-10
    • 1970-01-01
    • 1970-01-01
    • 2016-01-29
    • 1970-01-01
    • 2022-08-08
    • 2014-07-26
    相关资源
    最近更新 更多