如何为Qt构建生成的共享库嵌入soname
为Qt qmake构建的共享库嵌入SONAME的方法
可以实现,只需要在.pro项目文件中调整对应编译链接配置即可,不需要额外修改工具链或者构建流程。
现有配置不生效的原因
你当前的配置里写了CONFIG += plugin,qmake内置的Qt插件构建规则默认会追加no_soname编译标识,这个标识会让链接器跳过SONAME字段的写入,所以直接编译出来的so文件用objdump查不到SONAME条目。
配置步骤
在你现有的.pro文件里追加两行配置即可:
QT -= gui TEMPLATE = lib CONFIG += plugin # 移除插件模式默认禁用SONAME的配置 CONFIG -= no_soname # 指定链接器的SONAME参数,自动匹配生成的库文件名 QMAKE_LFLAGS_SONAME = -Wl,-soname,
如果你没有手动修改TARGET变量,qmake会默认以项目名作为库名,生成lib<项目名>.so格式的产物,对应的SONAME会自动和库文件名保持一致。
如果需要自定义SONAME(比如带版本号),可以直接通过链接参数指定,例如要把SONAME设为libxyz.so.1,追加一行配置就行:
QMAKE_LFLAGS += -Wl,-soname,libxyz.so.1
验证方法
修改完配置后按以下步骤重新构建:
- 执行
make clean清理之前的旧构建产物,避免旧文件干扰 - 重新运行qmake,让它解析最新的项目配置
- 执行make完成全量编译
编译完成后运行你提到的验证命令:
objdump -p libxyz.so | grep SONAME
就能得到你预期的输出:
SONAME libxyz.so
内容的提问来源于stack exchange,提问作者praveen
相关产品推荐
相关产品推荐

