Q_INIT_RESOURCE 无法解析的外部符号

加载Qt 静态/动态库时遇到的错误
Q_INIT_RESOURCE 无法解析的外部符号

static void initResource()
{
	// 资源名 ads 必须要与VS项目属性一致
	Q_INIT_RESOURCE(ads);
}

“Q_INIT_RESOURCE” 是 Qt 框架中的一个宏,用于初始化 Qt 资源系统。如果你在编译时遇到 “无法解析的外部符号”
错误,通常来讲有以下几个原因:

  1. 缺少对资源文件的引用:确保你在代码中正确引用了资源文件(通常是以 .qrc 扩展名结尾的文件)。你可以通过在 .pro 文件中添加
    RESOURCES += your_resource_file.qrc 来将资源文件与项目关联起来。

  2. 编译时未包含资源文件:如果你在编译时没有将资源文件包含在构建过程中,编译器将无法找到资源文件中定义的符号。请确保在构建项目时包含资源文件。

  3. 未正确生成资源文件:如果资源文件没有正确生成,其中定义的符号将无法解析。请确保资源文件正确配置,并使用 Qt 的资源编译器(rcc)将资源文件转换为 C++ 代码。

使用的是 vs2019,只是因为项目属性设置的资源名与代码当中的资源名不一致。

项目属性 / Qt Resource Compiler / rcc

把 Initialization Function Name 改为 ads

### 关于 `modpost` 和 `EXPORT_SYMBOL` 的内核编译错误解决方案 #### 1. **背景说明** 在 Linux 内核开发中,`modpost` 是一个用于处理模块符号导出和依赖关系的工具。当模块之间存在未解析符号引用时,可能会触发类似于以下的错误: ``` ERROR: modpost: "symbol_name" [module_path/module_name.ko] undefined! ``` 这种错误通常发生在模块尝试使用其他模块或核心部分导出的符号时,而这些符号并未被正确标记为可导出。 --- #### 2. **问题原因分析** - 如果某个模块(如 `msm_drm.ko`)试图访问另一个模块中的函数或变量,但该函数或变量未通过 `EXPORT_SYMBOL` 或 `EXPORT_SYMBOL_GPL` 导出,则会引发此错误[^3]。 - 另一种常见情况是,在高通或其他厂商定制的内核中引入了 vendor-specific hooks(例如 `__tracepoint_android_vh_*`),但由于某些模块单独编译而导致符号丢失[^3]。 - 对于静态初始化完成标志(如 `aw9523_init_finished`),如果其所在的模块未正确声明并导出该符号,则也会导致类似的链接失败。 --- #### 3. **解决方法** ##### 方法一:确保符号已正确定义与导出 对于需要跨模块使用的全局变量或函数,应在其实现文件中加入如下语句来显式导出它们: ```c // 假设要导出名为 'my_function' 的函数 void my_function(void); EXPORT_SYMBOL(my_function); // 若仅限 GPL 授权下的模块可以使用,则改为: EXPORT_SYMBOL_GPL(my_function); ``` 注意区分普通版本 (`EXPORT_SYMBOL`) 和受限版本 (`EXPORT_SYMBOL_GPL`) 的适用范围差异[^2]。 ##### 方法二:调整 Makefile 配置以支持共享符号表 当多个独立构建的目标间需相互引用内部实现细节时,可通过修改顶层 Makefile 添加额外参数指定外部符号位置: ```makefile KBUILD_EXTRA_SYMBOLS := /path/to/mod1.module.symvers \ /another/path/to/other_module_symvers_file ``` 这样可以让后续阶段识别到更多可能匹配项从而避免遗漏警告[^1]。 另外也可以考虑将关联紧密的功能单元组合打包成单一目标产物统一编译,减少中间环节干扰可能性。 ##### 方法三:针对特定 tracepoints 处理方式 如果是因追踪点定义缺失引起的问题,则应确认对应架构下是否有提供相应头文件以及实际生成逻辑;必要时手动补充缺少的部分或者重新配置环境使之包含完整的调试基础设施组件集合[^3]。 --- #### 4. **代码实例展示** 以下是基于上述理论的一个简单例子演示如何修正此类状况: 假设我们有两个分别负责不同职责却又有交集操作需求的小型驱动程序——`driver_a.c` 负责基础服务供给,而 `driver_b.c` 则扩展前者功能特性。为了使后者能够顺利调用前者的公开接口,我们需要做如下改动: **Driver A Source Code (driver_a.c):** ```c #include <linux/kernel.h> #include <linux/init.h> static int shared_resource; int access_shared_resource(int value){ return ++shared_resource + value; } EXPORT_SYMBOL(access_shared_resource); // Add this line to expose function. MODULE_LICENSE("GPL"); MODULE_AUTHOR("Example Developer"); MODULE_DESCRIPTION("A simple driver providing common utilities."); ``` **Driver B Source Code (driver_b.c):** ```c #include <linux/module.h> extern int access_shared_resource(int); // Declare usage of external entity here. static int __init b_driver_init(void){ printk(KERN_INFO "Accessing resource from another module...\n"); int result = access_shared_resource(42); printk(KERN_INFO "Result obtained was %d\n",result); return 0; } static void __exit b_driver_exit(void){ printk(KERN_INFO "Exiting secondary driver.\n"); } module_init(b_driver_init); module_exit(b_driver_exit); MODULE_LICENSE("Proprietary"); // Note non-GPL license. MODULE_AUTHOR("Another Example Dev"); MODULE_DESCRIPTION("An extended feature set leveraging core capabilities."); ``` 最后记得同步更新各自的 makefiles 设置以便顺利完成整个流程! --- ###
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值