'drm_of_crtc_port_mask' exported twice. Previous export was in vmlinux这个错误怎么解决
时间: 2024-03-11 13:51:33 浏览: 312
这个错误提示是因为同一个符号(symbol)被导出了两次,可能是由于代码中有重复的导出声明或者导出定义。
解决这个问题的方法是:
1. 检查代码中是否有重复的导出声明或者导出定义,如果有则需要删除其中一个。
2. 如果是在不同的文件中导出了同一个符号,可以将其中一个文件中的导出声明改为 extern,避免重复导出。
3. 如果在编译时出现了这个错误,可以在 Makefile 中添加 -fno-common 选项来禁用公共符号(common symbols)。
例如,在 Makefile 中添加以下选项:
```
CFLAGS += -fno-common
```
这样可以避免公共符号被多次定义,从而解决这个错误。
相关问题
linux kernel 符合GPL协议的驱动文件怎么使用drm_of.c中定义的EXPORT_SYMBOL_GPL(drm_of_lvds_get_dual_link_pixel_order);
EXPORT_SYMBOL_GPL是一个宏,用于将符号(symbol)暴露给其他模块使用。在Linux内核中,符号是指函数、变量或常量等。EXPORT_SYMBOL_GPL的作用是将符号标记为只能由GPL协议模块使用,这意味着只有使用GPL协议的模块才能使用该符号。
在使用EXPORT_SYMBOL_GPL(drm_of_lvds_get_dual_link_pixel_order)之前,需要确保该符号已经被定义。在drm_of.c文件中,该符号已经被定义为一个函数。如果你想在其他GPL协议的模块中使用该函数,可以在模块代码中使用extern声明该符号,然后就可以像使用其他函数一样使用它了。例如:
```c
#include <linux/module.h>
#include <linux/drm/drmP.h>
extern int drm_of_lvds_get_dual_link_pixel_order(struct device_node *np);
static int my_module_init(void)
{
struct device_node *np;
int pixel_order;
/* 获取设备节点 */
np = of_find_node_by_name(NULL, "lvds");
if (!np) {
pr_err("Failed to find lvds node\n");
return -ENODEV;
}
/* 调用drm_of_lvds_get_dual_link_pixel_order函数 */
pixel_order = drm_of_lvds_get_dual_link_pixel_order(np);
pr_info("Dual link pixel order: %d\n", pixel_order);
/* 释放设备节点 */
of_node_put(np);
return 0;
}
static void my_module_exit(void)
{
/* 模块退出时的清理工作 */
}
module_init(my_module_init);
module_exit(my_module_exit);
MODULE_LICENSE("GPL");
MODULE_DESCRIPTION("My Linux kernel module");
```
阅读全文