如何解决此c链接器错误?
我在我的程序中声明了一个全局变量,如上所述,但是我得到了一个链接器错误 LNK2005:_测量值已在MAIN.obj中定义 我正在修改代码如何解决此c链接器错误?,c,arrays,pointers,linker,C,Arrays,Pointers,Linker,我在我的程序中声明了一个全局变量,如上所述,但是我得到了一个链接器错误 LNK2005:_测量值已在MAIN.obj中定义 我正在修改代码 uint8 *measurements[30] = {(uint8*)0x0041c620}; ) 然后我也得到了一个错误这个错误告诉你,你已经在不止一个翻译单元中定义了这个全局变量-在MAIN.obj以及其他一些单位中。哪一个我不能说,因为你没有发布整个错误消息,只有一行 您的问题没有包含足够的信息来重现问题,也没有告诉您错误的确切位置。也许您在头文件
uint8 *measurements[30] = {(uint8*)0x0041c620};
)
然后我也得到了一个错误这个错误告诉你,你已经在不止一个翻译单元中定义了这个全局变量-在MAIN.obj以及其他一些单位中。哪一个我不能说,因为你没有发布整个错误消息,只有一行
您的问题没有包含足够的信息来重现问题,也没有告诉您错误的确切位置。也许您在头文件中定义了变量?定义是否在头文件中?如果是这样,那么对于包含头的每个源文件,您将得到一个变量定义。尝试标记更改标头以仅声明变量,而不是定义变量,如下所示:
typedef unsigned char uint8;
uint8 *measurements[30];
measurements[30]= {(uint8*)0x0041c620}
然后在其中一个文件中定义它,例如main.c,如下所示:
extern uint8_t *measurements[30];
看起来您需要一个包含30个8位值的数组,并且该数组已经存在于某个特定地址 在一个源文件(measurements.c)中: 在头文件(measurements.h)中: 用法:
uint8 * const measurements;
注意,我添加了
const
,因为我认为您不想更改数组地址(0x0041c620) 您在何处声明了度量变量?如果您在另一个文件中使用全局变量。。在您试图使用外部程序的地方使用它。@vladmir:我编辑了代码。这是正确的方法吗?检查您链接的任何其他对象文件中是否定义了测量值。如果是这样的话,您可能希望声明它为static,以使符号对外部世界不可见。或者,正如Digital_Reality所指出的,假设您想使用关键字extern
来使用“other”声明。请看一下文件或相关讨论。Jens:非常感谢您的回复。它显示测量值的大小为4字节,但我指定为uint8。它应该是每个1字节。谢谢你的回复。大小为4字节。如何将其设置为1字节?uint8是8位整数,但如果我喜欢上面的方法,则每个变量的大小为4字节。这可能是因为您声明的是指向8位值的指针数组,而不是8位值数组。尝试uint8_t测量[30]={0x11、0x22、0x33};或者类似的。根据代码猜测,您可能希望从地址0x0041c620加载一个8位值。您可以这样做:uint8_t度量[30]={*(uint8_t*)0x0041c620};0x0041c620:这将是测量的起始地址??应该是。我希望你知道当硬编码地址时你在做什么。你能告诉我那是什么吗?那是什么?您应该知道0x0041c620来自哪里,这是您的问题。哦,对不起。每个变量的大小为4字节。如何使其成为1字节??
uint8 * const measurements = (uint8*)0x0041c620;
uint8 * const measurements;
#include "measurements.h"
// In some function
measurements[29] = ... // Set last element to something