我学习了“ 程序库指南
”。它提到soname
像下面这样用来管理版本。
gcc -shared -fPIC -Wl,-soname,libfoo.so.1 -o libfoo.so.1.0.0 foo.c
ln -s libfoo.so.1.0.0 libfoo.so.1
ln -s libfoo.so.1 libfoo.so
我得到的信息是,如果soname
未设置。它等于libfoo.so.1.0.0,
而且我发现它也可以在没有soname的情况下工作,例如以下
gcc -shared -fPIC -o libfoo.so.1.0.0 foo.c
ln -s libfoo.so.1.0.0 libfoo.so.1
ln -s libfoo.so.1 libfoo.so
因此,我认为唯一有用的一点是,soname
当您使用readelf -d libfoo.so
命令检查共享库时,该选项可以告诉您共享库的版本。
它还能做什么?
soname用于指示您的库支持哪些二进制api兼容性。
SONAME
链接器在编译时使用它从库文件中确定实际的目标库版本。gcc -l NAME
将寻找lib
NAME
.so链接或文件,然后捕获其SONAME,它肯定会更加具体(例如libnuke.so链接到包含SONAME
libnuke.so.0的libnuke.so.0.1.4)。
在运行时它将与之链接,然后将其设置为ELF动态节NEEDED
,然后应存在具有该名称的库(或指向它的链接)。在运行时将SONAME
被忽略,因此仅链接或文件存在就足够了。
备注:SONAME仅在链接/构建时强制执行,而不在运行时强制执行。
库的“ SONAME”可以与“ objdump -p文件| grep SONAME”一起看到。二进制文件“ NEEDED”可以在“ objdump
-p文件| grep NEEDED”中看到。
[编辑]警告以下是一般性说明,而不是Linux中部署的说明。参见最后。
假设您有一个名称为libnuke.so.1.2的库,并开发了一个新的libnuke库:
[编辑]完成:Linux情况。
在Linux现实生活中,SONAME是一种特定形式:lib [NAME] [API-VERSION] .so。[major-version] major-
version仅是一个整数值,该值在每次主要库更改时都会增加。API-VERSION默认为空
前libnuke.so.0
然后,实际文件名包括次要版本和子版本,例如:libnuke.so.0.1.5
我认为不提供soname是一种不好的做法,因为重命名文件会改变其行为。
15.3.5.构建共享库 假定你已经安装好了NDK,解下来就可以构建共享库了:切换到项目目录,执行ndk/ndk-build即可。其中ndk表示你的NDK安装目录。 构建完成之后,你可以见到一个新的子目录lib,里面放有刚刚生成的共享库文件。 Note: 共享库默认是面向ARM平台构建,这样可以方便在仿真器上运行。 在下一节,我们将共享库打包进APK文件,供应用程序调用。
问题内容: 当以详细模式运行jvm时,它显示文件正在从共享库文件中加载,如下所示 什么是共享库文件?我以为这些是rt.jar中的文件,并且从那里开始加载;但是rt.jar的打开时间很长 提取rt.jar之后,无论如何,我发现它具有从共享库文件中加载的所有类。 问题答案: 这是类数据共享。运行Sun / Oracle Client HotSpot并启用共享(默认值或)时,该文件将进行内存映射。该文件
问题内容: 我有一个依赖于希望在目录结构中找到共享库的程序。我想将共享库移到一个更好的位置。在OS X上,可以使用install_name_tool来完成。我找不到Linux的等效版本。 作为参考,吐出以下解释的输出: (根据要求,:) 我想将“ this / is / terrible / library.so”更改为“ shared / library.so”。请注意,如果程序留在其“构建”位
问题内容: 我最近阅读了很多有关Linux上共享库的信息,这是我所学到的: 共享库应嵌入,包括其主要版本号。就像是: 其实际文件名还应包含次要版本号。就像是: 当库文件复制到,比方说,如果运行时,它会读取,创建一个名为符号链接指向。 如果要使用此库进行开发,则应首先创建一个指向实际文件的没有任何版本号的符号链接。这通常由 开发 包(打包库时)完成。 它是否正确 ? 问题答案: 建议阅读: Ulri
我正在尝试建立一个共享库,可以用来访问本机蓝牙API函数。我目前正试图编译一个c文件:https://android.googlesource.com/platform/external/bluetooth/bluedroid/ 每当我尝试将这些代码中的任何一个编译为共享库时,我都会收到许多未定义的引用错误...它看起来像是头文件引用的每个函数。在我最近的尝试中,我将整个Bluedroid/bta
我根据以下站点遵循了该过程:https://developer.vuforia.com/resources/dev-guide/step-3-compiling-running-vuforia-sample-app。 我试图通过cygwin构建ImageTargets共享库,但显示的消息是: 和