IMPORTED_SONAME的用途是什么?
假设我有一个导入库 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命令将实际名称传递给链接器,且可执行目标依赖于 SONAME 的 libmylib.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_SONAME 或 IMPORTED_NO_SONAME。
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。