在构建Android内核时从不兼容的指针类型初始化
从源代码处编译LG stock内核时,我在下面的一行中遇到“从不兼容的指针类型初始化”错误:在构建Android内核时从不兼容的指针类型初始化,android,pointers,kernel,build-error,lg,Android,Pointers,Kernel,Build Error,Lg,从源代码处编译LG stock内核时,我在下面的一行中遇到“从不兼容的指针类型初始化”错误: .detect = mmc_detect 可在本声明中找到: static const struct mmc_bus_ops mmc_ops = { .awake = mmc_awake, .sleep = mmc_sleep, .remove = mmc_remove, .detect = mmc_detect, .suspend = NULL, .r
.detect = mmc_detect
可在本声明中找到:
static const struct mmc_bus_ops mmc_ops = {
.awake = mmc_awake,
.sleep = mmc_sleep,
.remove = mmc_remove,
.detect = mmc_detect,
.suspend = NULL,
.resume = NULL,
.power_restore = mmc_power_restore,
.alive = mmc_alive,
.change_bus_speed = mmc_change_bus_speed,
};
mmc_总线_操作声明如下:
struct mmc_bus_ops {
int (*awake)(struct mmc_host *);
int (*sleep)(struct mmc_host *);
void (*remove)(struct mmc_host *);
#ifdef CONFIG_MACH_LGE
int (*detect)(struct mmc_host *);
#else
void (*detect)(struct mmc_host *);
#endif
int (*suspend)(struct mmc_host *);
int (*resume)(struct mmc_host *);
int (*power_save)(struct mmc_host *);
int (*power_restore)(struct mmc_host *);
int (*alive)(struct mmc_host *);
int (*change_bus_speed)(struct mmc_host *, unsigned long *);
};
static int mmc_detect(struct mmc_host *host)
{
int err;
BUG_ON(!host);
BUG_ON(!host->card);
mmc_rpm_hold(host, &host->card->dev);
mmc_claim_host(host);
/*
* Just check if our card has been removed.
*/
err = _mmc_detect_card_removed(host);
mmc_release_host(host);
/*
* if detect fails, the device would be removed anyway;
* the rpm framework would mark the device state suspended.
*/
if (!err)
mmc_rpm_release(host, &host->card->dev);
if (err) {
mmc_remove(host);
mmc_claim_host(host);
mmc_detach_bus(host);
mmc_power_off(host);
mmc_release_host(host);
}
return 0;
}
然后你会像这样检测:
struct mmc_bus_ops {
int (*awake)(struct mmc_host *);
int (*sleep)(struct mmc_host *);
void (*remove)(struct mmc_host *);
#ifdef CONFIG_MACH_LGE
int (*detect)(struct mmc_host *);
#else
void (*detect)(struct mmc_host *);
#endif
int (*suspend)(struct mmc_host *);
int (*resume)(struct mmc_host *);
int (*power_save)(struct mmc_host *);
int (*power_restore)(struct mmc_host *);
int (*alive)(struct mmc_host *);
int (*change_bus_speed)(struct mmc_host *, unsigned long *);
};
static int mmc_detect(struct mmc_host *host)
{
int err;
BUG_ON(!host);
BUG_ON(!host->card);
mmc_rpm_hold(host, &host->card->dev);
mmc_claim_host(host);
/*
* Just check if our card has been removed.
*/
err = _mmc_detect_card_removed(host);
mmc_release_host(host);
/*
* if detect fails, the device would be removed anyway;
* the rpm framework would mark the device state suspended.
*/
if (!err)
mmc_rpm_release(host, &host->card->dev);
if (err) {
mmc_remove(host);
mmc_claim_host(host);
mmc_detach_bus(host);
mmc_power_off(host);
mmc_release_host(host);
}
return 0;
}
我的猜测是,这里的问题是,mmc_bus_ops.detect声明为指针,但mmc_detect声明为正常int。然而,据我所知,这对于mmc_bus_ops.awake和mmc_awake也是正确的,但这不会产生任何错误。问题是如何修复这个问题,以及我如何在股票内核中得到这些错误?如果LG可以在这种状态下编译内核,为什么我必须先编辑所有内容?非常感谢您的帮助和解释 void(*detect)(struct mmc\u host*)
是指向声明为void func(struct mmc\u host*arg)
的函数的指针。请注意void
返回类型
int-mmc\u-detect(struct-mmc\u-host*host)
具有int
返回类型,因此不兼容
由于mmc\u detect
仅返回0,因此返回值不相关,指针赋值在逻辑上可以接受,但可能会破坏编译后的代码
如果LG可以编译这段代码,那么他们可能正在使用一些其他编译器标志,允许发出警告而不是错误。参见gcc示例;有许多其他选项可以设置为或多或少严格执行或禁止某些代码结构