链接优先选择动态链接库so

makefile里面使用-lmemcached,没想到却使用了memcached.so.2。而不是想象中的.a库。

原来连接的时候优先选择动态库。

### 如何在 OpenWRT 中配置和链接动态库 #### 配置环境准备 为了确保能够在OpenWRT中成功链接动态库,需要先准备好相应的开发环境。这通常涉及到设置好feeds并更新它们,以便获取最新的包列表。 对于OpenWRT来说,可以通过编辑`./feeds.conf.default`文件来添加第三方仓库[^1]。之后运行命令: ```bash ./scripts/feeds update -a && ./scripts/feeds install -a ``` 这样就可以同步所有已定义的feed资源,并安装所需的软件包。 #### 动态库的选择与编译 当目标是集成特定的动态库时,比如`libmosquitto`用于支持MQTT通信协议,则应该优先考虑利用官方提供的工具链来进行操作。一种推荐的方法是从菜单配置界面选择对应的组件进行构建[^4]。 进入Makefile配置阶段,执行下面这条指令打开图形化配置选项卡: ```bash make menuconfig ``` 找到网络类别下的`Libraries`部分,勾选`libmosquitto`以包含该库到即将创建的固件映像里去。完成上述设定后保存退出即可继续下一步骤——实际编译过程。 #### 编译过程中指定参数 启动正式编译流程之前,建议清理之前的残留数据防止潜在冲突发生: ```bash make clean ``` 接着按照常规方式进行全量编译工作: ```bash make V=s ``` 这里的`V=s`表示显示详细的编译日志信息方便调试排查问题所在之处。整个过程会自动处理依赖关系并将选定的动态库打包进去。 #### 应用程序调用动态库的方式 一旦完成了含有所需共享对象(.so)文件的目标镜像制作完成后刷入设备端,在编写应用程序的时候只需要遵循POSIX标准API接口规范就能正常加载这些预先存在的.so模块了。例如C/C++编程语言环境下可采用dlopen/dlsym函数族实现按需装载特性[^2]。 假设有一个简单的测试案例想要验证是否能够正确访问外部符号名空间内的功能实体,那么可以参照如下示范代码片段所示: ```c #include <stdio.h> #include <dlfcn.h> int main() { void* handle; char* error; // 加载 libmosquitto 的 .so 文件 handle = dlopen("libmosquitto.so", RTLD_LAZY); if (!handle) { fprintf(stderr, "%s\n", dlerror()); return 1; } // 清除任何现有的错误状态 dlerror(); // 获取 mosquitto_lib_init 函数指针 typedef int (*init_func)(); init_func init_mosq = (init_func)dlsym(handle, "mosquitto_lib_init"); if ((error = dlerror()) != NULL){ fprintf(stderr, "%s\n", error); return 1; } // 调用初始化函数 init_mosq(); // 卸载库 dlclose(handle); printf("Successfully loaded and used the dynamic library.\n"); } ``` 这段示例展示了如何通过程序逻辑显式地引入位于文件系统的某个位置上的`.so`形式的动态连接库实例,并尝试调用其中公开暴露出来的入口点之一完成必要的初始化动作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值