在构建Android内核时从不兼容的指针类型初始化

在构建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

从源代码处编译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,
    .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示例;有许多其他选项可以设置为或多或少严格执行或禁止某些代码结构