未定义引用`GOIO_SET'linux

时间:2014-04-02 09:31:29

标签: linux

我已经为下面显示的set function编写了一个宏,并且正在使用raspberry pi

#define GPIO_SET(g) (*(gpio.addr + 7) |= (1<<(g)))

#define ALL_COL_HIGH    (GPIO_SET(COL1) | GOIO_SET(COL2) | GPIO_SET(COL3) | GPIOO
_SET(COL4))

当我编译文件时,我会收到以下错误

**undefined reference to `GOIO_SET'**

我怎么能克服这个?

1 个答案:

答案 0 :(得分:0)

您是否注意到您定义了GPIO_SET,但之后使用了GOIO_SET?第二个字母是不同的!定义中为P,但使用中为O。另外还有其他拼写错误:GPIOO_SET有两个O

由于未定义GOIO_SET名称,编译器认为它必须是函数或其他东西,但它没有定义,所以它会给你错误。

作为旁注,我认为你的代码是错误的。您的ALL_COL_HIGH宏将扩展为:

(*(gpio.addr + 7) |= (1<<(COL1))) | (*(gpio.addr + 7) |= (1<<(COL2))) ...

这将在没有中间序列点的情况下多次修改相同的值(*(gpio.addr + 7)),这是未定义的行为。

您可以使用逗号运算符解决此问题,因为|中的ALL_COL_HIGH毫无意义:

#define ALL_COL_HIGH (GPIO_SET(COL1) , GPIO_SET(COL2) , GPIO_SET(COL3) , GPIO_SET(COL4))

逗号运算符确实包含一个序列点,所以一切都会好的。

虽然通常更容易将COLx值定义为实际位并同时设置所有位。

#define COL1 (1<<1)
#define COL2 (1<<2)
#define COL3 (1<<3)
#define COL4 (1<<4) //or whatever

#define GPIO_SET(g) (*(gpio.addr + 7) |= (g))
#define ALL_COL_HIGH (GPIO_SET(COL1 | COL2 | COL3 | COL4))