IMPORTED_SONAME的用途是什么?

编程语言 2026-07-10

假设我有一个导入库 libmylib.so.1.0,它带有 SONAME = libmylib.so 字段。

在导入库时

add_library(mylib SHARED IMPORTED)
set_target_properties(mylib PROPERTIES IMPORTED_LOCATION path/to/libmylib.so.1.0)
set_target_properties(mylib PROPERTIES IMPORTED_SONAME libmylib.so)

并链接到一个可执行目标。CMake命令将实际名称传递给链接器,且可执行目标依赖于 SONAMElibmylib.so。我的问题是,为什么CMake需要知道 SONAME?以及在什么情况下不指定 IMPORTED_SONAME 实际上会导致问题?

解决方案

首先,以下是关于什么是SONAME的背景说明:https://stackoverflow.com/a/14613602/637669

请注意,那个回答把“在运行时SONAME被忽略”说成是正确的,这其实是错误的,后面的评论中有解释。

现在进入核心问题。NO_SONAME目标属性的文档指出

如果你在normal shared libraries which other targets link against使用它,在某些平台上,链接器会把库的完整路径(在链接时指定的路径)插入到依赖二进制的动态段中。因此,一旦安装,动态加载器可能最终无法定位到该二进制所依赖的库。

这似乎是原因为什么CMake想要为给定库知道正确的 SONAME。对于由CMake自身创建的库,它可以自动推断该属性的值,但似乎没有通用的方法可以为导入目标计算 SONAME。因此,CMake依赖用户来设置 IMPORTED_SONAMEIMPORTED_NO_SONAME

站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章