- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我有一个 linux 应用程序,它在链接器行上链接到:libpython2.6.so
这最终解析为 libpython.2.6.so.1.0
/usr/lib/libpython2.6.so -> libpython2.6.so.1
/usr/lib/libpython2.6.so.1 -> libpython2.6.so.1.0
其中嵌入了 SONAME,因此我坚持使用它链接到完全版本化的名称。
g++ foo.cc /usr/lib/libpython2.6.so
ldd ./a.out | grep python
libpython2.6.so.1.0 => /usr/lib/libpython2.6.so.1.0 (0x00007fd36f7ab000)
这意味着如果有 libpython2.6.so.1.1,我的应用程序最终将崩溃。无论如何强制我的应用程序使用通用名称 libpython2.6,而不是 libpython2.6.so.1.0?
我使用了这么小的一组 python API,我认为我应该安全地链接到库的更通用的版本名称。
最佳答案
看看``3.1.1。 http://tldp.org/HOWTO/Program-Library-HOWTO/shared-libraries.html 中的共享库名称 '' ,这可能有助于您了解共享库的命名方法。
Every shared library has a special name called the
soname''. The soname
lib'', the name of the library, the phrase
has the prefix.so'',
lib''). A fully-qualified soname includes as a prefix the directory it's in; on a working system a fully-qualified soname is simply a symbolic link to the shared library's ``real name''.
followed by a period and a version
number that is incremented whenever
the interface changes (as a special
exception, the lowest-level C
libraries don't start withEvery shared library also has a ``real name'', which is the filename containing the actual library code. The real name adds to the soname a period, a minor number, another period, and the release number. The last period and release number are optional. The minor number and release number support configuration control by letting you know exactly what version(s) of the library are installed. Note that these numbers might not be the same as the numbers used to describe the library in documentation, although that does make things easier.
In addition, there's the name that the compiler uses when requesting a library, (I'll call it the ``linker name''), which is simply the soname without any version number.
关于linux - 链接符号链接(symbolic link)而不是soname,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4561871/
如何以一种方式链接二进制文件以与两个现有版本的库兼容,这两个版本具有冲突的 SONAME ?这两个版本不共享相同的 SONAME 前缀。一个是 libcapi10.so.3,另一个是 libcapi1
我正在尝试在 64 位 Ubuntu 12.04 上构建 SLitrani。我已经从源代码构建了 ROOT 5.34.03,我确实弄清楚了如何为 $ROOTDEV 设置 LD_LIBRARY_PATH
如果我创建一个没有像这样的 SONAME 的共享库 gcc -shared libfoo.o -o libfoo.so 并链接到它, 链接器如何找到我的共享库? 是文件名libfoo.so被链接器视为
我正在编译 sipXtapi,我需要用这一行编译 gcc -shared -DPIC .libs/codec_pcmapcmu_la-CodecPcmaWrapper.o .libs/codec_
我制作了一个程序,它使用两个共享库(我编译的)并且放置如下: /home_directory_where_I_compile_and_run_everything -->/lib/libjson_li
我已经编写了一个共享对象来修改 FreeType 的 FT_Load_Glyph 和 FT_Render_Glyph 函数的参数,目前通过将其插入 LD_PRELOAD 和 dlsym。 这工作正常,
我学会了“ Program Library HOWTO ”。它提到使用 soname 来管理版本,如下所示。 gcc -shared -fPIC -Wl,-soname,libfoo.so.1 -o
我正在为一个库制作一个 Debian 包,我称之为 libmystuff。目前版本为 4.0.0,下一个版本将是 4.1.0,并且可能会破坏 API 兼容性。该项目使用 CMake 构建。 这在 so
我正在使用 eclipse cdt 来编译和运行 C++ 应用程序。 My_main_program 特别需要 libjpeg.so.62。 我的 Ubuntu 系统以前在 /usr/local/li
我正在使用 Cmake for Android(使用 Android NDK)编译 libclang。 这是配置文件名和soname的CMake配置部分: set_target_properties(
我想从不同平台上的源代码构建Boost。我已经能够在linux上(在docker镜像上)做到这一点。我也可以在自己的计算机(Mac OS X 10.13 Xcode 9.4.1)上执行此操作,但是当我
我正在尝试在 mysql 5.5 中安装半同步复制并尝试执行以下命令: 安装插件“rpl_semi_sync_master”SONAME“semisync_master.so” 但是这个命令抛出以下错
我正在尝试使用 cmake 构建一个 rpm 包。这个包构建了一个库并将其打包好,一切都是 hunky-dory 在下一次迭代中,我使用以下命令添加“soname” set_property(TARG
据我了解,“/lib/ld-linux.so.2”中的“2”很少更改。有不能与新库一起工作的旧程序,也有不能与旧库一起工作的新程序。但它们都引用/lib/ld-linux.so.2,从而阻止安装这两个
我尝试在 Mac OS X 上使用 CMake 构建我的应用程序,但出现以下错误: Linking CXX shared library libsml.so ld: unknown option: -
我正在用 cmake android 交叉编译 gdcm,直到编译结束,但最后我得到以下错误。你们如何在编译库时在 cmake-gui 或 cmake 中设置 -soname,这样我们就可以避免以下类
我是一名优秀的程序员,十分优秀!