我想在计算机上安装一个无法重新编译的可执行文件,它不是作为包构建的,我想下载运行它们所需的库。
以下是ldd在其上运行的输出的一部分
libpango-1.0.so.0 => /usr/lib/i386-linux-gnu/libpango-1.0.so.0 (0xb702f000)
libcairo.so.2 => /usr/lib/i386-linux-gnu/libcairo.so.2 (0xb6f64000)
libatk-1.0.so.0 => /usr/lib/i386-linux-gnu/libatk-1.0.so.0 (0xb6f43000)
libsqlite3.so.0 => /usr/lib/i386-linux-gnu/libsqlite3.so.0 (0xb6e9e000)
libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb6cf4000)
/lib/ld-linux.so.2 (0xb786e000)
libxcb.so.1 => /usr/lib/i386-linux-gnu/libxcb.so.1 (0xb6cd3000)
libgio-2.0.so.0 => /usr/lib/i386-linux-gnu/libgio-2.0.so.0 (0xb6b7c000)
libm.so.6 => /lib/i386-linux-gnu/libm.so.6 (0xb6b4f000)
Run Code Online (Sandbox Code Playgroud)
是否有工具可以使用此信息来选择应下载哪些包,或者更好地仅提取列出的库及其依赖项,以最大限度地减少磁盘使用量?系统在无头 VM 上运行,程序将通过 VNC 显示。
虽然我怀疑一个完整的图形桌面将提供大部分所需的库,但我只想下载所需的库、它们的依赖项以及刚好足以支持它的 X Windows 包。
重启电脑后,里面ld.so.cache还有信息,所以我的问题如下:
信息总是保存在那里吗?它不是在重新启动后被删除之类的吗?像 RAM 或浏览器缓存被删除?
在我删除安装了一些共享库的应用程序后,它是否知道也从ld.so.cache? 如果我使用ldconfig它会删除信息吗?它实际上是如何工作的?
如果我正在安装程序,我的计算机如何知道使用已添加的新库?之后apt-get install的ldconfig运行?
在我的情况下,似乎LD_LIBRARY_PATH设置为空字符串。但是所有标准系统工具仍然可以正常工作,所以我猜动态链接器会检查这种情况并LD_LIBRARY_PATH在这种情况下使用一些默认值。
这个默认值是多少?我想它至少包括/usr/lib但还有什么?有没有什么好的系统方法来确定动态链接器将搜索的标准位置?
这个问题与动态链接器将搜索的路径略有不同。 有一个默认值意味着它会使用LD_LIBRARY_PATH如果给定的值,或者如果没有给定,它将使用默认值 - 这意味着它不会使用如果LD_LIBRARY_PATH提供了默认值。
我经常从源代码构建各种库以供使用,例如 gmp-6.1.2、mpfr-4.0.1 和 gcc-7.x。这样做时,我更喜欢使用,--prefix=/usr/local/gcc-7.2.0所以我确切地知道它的安装位置并且不会弄乱现有的库。然后我基本上只知道最后make install告诉我的是更新或设置LD_LIBRARY_PATH,有时但不总是LD_RUN_PATH。
大多数情况下,我只是LD_LIBRARY_PATH稍后根据需要手动设置,或者以类似的方式全局设置它/etc/bash.bashrc.local并且有效。
这make install就是说:
Libraries have been installed in:
/usr/local/mfprtest/lib
If you ever happen to want to link against installed libraries
in a given directory, LIBDIR, you must either use libtool, and
specify the full pathname of the library, or use the '-LLIBDIR'
flag during linking and do at least one of the following:
- add LIBDIR to the 'LD_LIBRARY_PATH' environment variable …Run Code Online (Sandbox Code Playgroud) 我已经完成了这个问题的答案,但不太明白系统调用和库函数之间的区别。从概念上讲,两者有什么区别?
我注意到我编译为 gcc 的所有程序都链接到 vdso 库。这是包含对内核的系统调用的库,例如 mmap() 和 fork() 以及其他系统调用吗?
我知道系统调用不是 GNU C 标准库的函数,所以它们的目标代码必须在编译时与应用程序链接的某个库中?
那么 vdso 是那个库吗?
kernel libraries system-calls dynamic-linking shared-library
我正在使用一台服务器,运行旧版本的 Linux。我没有系统的 root 访问权限,所以我想构建一个我经常使用的工具的更新版本(Vim 7.3)。我想我会构建它并将其安装在 ~/bin 中。但是,它需要未在系统范围内安装的 ncurses 开发文件。我找到了 ncurses-devel rpm,并提取了“lib”和“include”文件夹,我将它们放在哪里以及如何告诉 ./configure 脚本找到它们,以便我可以在本地正确配置和构建包?
编辑:我最终通过在 Virtualbox 中安装相同的操作系统来解决这个问题,并在那里构建包并复制二进制文件。
运行以下命令后:
g++ lex.yy.c -lfl
我收到以下错误:
/usr/bin/ld: cannot find -lfl
我该如何解决?
我已经在一台 Linux 机器 (M1) 上安装了程序 Motion,并希望在另一台 (M2) 上安装相同的程序。
这个程序有多种版本,我忘记了我用过哪个版本,所以我可以直接从 M1 复制 user/bin/motion 文件并将其放在 M2 的 user/bin/motion 中吗?
我知道配置文件在哪里,所以我会移动它,但我不确定运动的工作版本在 M2 上使用什么视频驱动程序;有什么办法可以查到吗?
有没有办法找出它的依赖关系?
libraries ×10
dependencies ×2
gcc ×2
system-calls ×2
architecture ×1
centos ×1
defaults ×1
executable ×1
kernel ×1
ld ×1
ld.so.conf ×1
ldconfig ×1
linux ×1
path ×1
portability ×1