![如果我从源代码构建来安装现有库的最新版本,会发生什么?](https://linux22.com/image/819751/%E5%A6%82%E6%9E%9C%E6%88%91%E4%BB%8E%E6%BA%90%E4%BB%A3%E7%A0%81%E6%9E%84%E5%BB%BA%E6%9D%A5%E5%AE%89%E8%A3%85%E7%8E%B0%E6%9C%89%E5%BA%93%E7%9A%84%E6%9C%80%E6%96%B0%E7%89%88%E6%9C%AC%EF%BC%8C%E4%BC%9A%E5%8F%91%E7%94%9F%E4%BB%80%E4%B9%88%EF%BC%9F.png)
我是 Linux 新手,我使用 Synaptic 包管理器来安装我需要的所有软件。我也这样做了mathgl,科学图表库。
最近网上出现了一个新版本,但没有在包管理器中。我下载了源代码并尝试手动安装。说明说:
cmake .
cmake .
make
make install
我做了完全相同的事情,但后来我意识到我忘记了一些构建选项。我在网上搜索如何卸载库,以便我可以使用新设置安装它,但我没有得到明确的答案。我发现,当谈到在 Linux 下卸载时,除非开发人员提供了卸载脚本,否则你只能靠自己,这并不容易。
考虑到这一点,我只是尝试安装该库而不删除配置错误的库。
cmake -D enable-all=on -D enable-langall=on .
cmake -D enable-all=on -D enable-langall=on .
make
make install
一切似乎都很好。我的问题是:我的行为是否可能带来后果并反过来困扰我?
我也很担心,因为旧的库没有被删除,旧的头文件也没有被删除。另一件奇怪的事情是,旧的头文件在
/usr/lib/mgl
而新的
/usr/local/lib/mgl2
对此有什么解释吗?
答案1
我的行为是否会导致后果反过来困扰我?
也许吧。请继续阅读:
新的(“启用…:) 配置的库已经覆盖了新的您安装的配置错误的库...没有造成损害。
新的库安装在
/usr/local
因为这是许多 Linux 发行版的默认设置,但是不是Ubuntu;Ubuntu 将它们放在 下/usr
。前者适用于二进制文件(/usr/local/bin
),Ubuntu 的默认路径中有这些文件,并且这些文件将优先于 中安装的任何二进制文件/usr/bin
,但这是不对对于图书馆来说,/usr/local/lib
因为不是在默认路径中。任何使用该库的程序都将继续使用 中的旧标头/版本
/usr/lib
,除非您明确告诉这些程序使用新标头/版本,例如通过在它们前面加上前缀LD_LIBRARY_PATH=...
或明确添加/usr/local/lib
到您的路径中。要编译依赖于此库的东西,您需要明确指定/usr/local/lib
包含新标头的路径。修复这个问题:
- 删除 repo 安装的库版本是一个好主意,除非它有大量依赖项,在这种情况下保留它(否则您必须重新编译所有内容)。
- 安装检查安装,您可以使用它来代替最后
make install
一步,为您提供易于安装的 deb 文件和卸载。 - 在编译之前通过指令设置正确的安装前缀
-DCMAKE_INSTALL_PREFIX=/usr
。
那就可以了!
答案2
嗯,新版本使用的是来自的库/usr/local/lib
(这是用户安装软件的常用位置)。这其实是件好事,主要目的是不破坏通过包管理器安装的包。
库的位置通常在 Makefile 中定义。我建议不要碰它,除非你知道自己在做什么。自己编译的版本将使用来自的库/usr/local/lib
,从 repo 安装的其他版本将使用标准/usr/lib
位置。