终于遇到了大家“喜闻乐见”的 Matrix
包问题,就是 as_cholmod_sparse
,大家如果经常是使用r语言跑单细胞转录组就大概率会遇到,其实解决方案我们早就摸索好了也发给大家了:
# remove.packages("Matrix")
# remove.packages("irlba")
# BiocManager::install("irlba",force = T)
# BiocManager::install("Matrix",force = T)
就是卸载两个包之后再重新安装即可,如果重新安装的时候没有保证安装到指定版本,就需要最后的大招;remotes::install_version
,但是我遇到的问题比较奇葩说需要低版本的:
remotes::install_version("Matrix", version = "1.6-1.1")
并不是说要大家都安装这个低版本哦,因为每个人的电脑里面的r和其它r包版本都不一样,都是互相依赖的,所以每个人需要的版本都不一样,这一点非常的热心,比如你有可能会遇到如下所示的报错:
namespace ‘Matrix’ 1.6-1.1 is being loaded, but >= 1.6.3 is required
Error: package ‘SeuratObject’ could not be loaded
这个解决方案对绝大部分人来说都是ok的,但是就怕碰到MacOS电脑,因为它有普通因特尔芯片和Mac的arm芯片两个略微有差异的情形。比如你大概率会遇到下面的问题:
ld: warning: -single_module is obsolete
ld: warning: -multiply_defined is obsolete
ld: warning: search path '/opt/gfortran/lib/gcc/x86_64-apple-darwin20.0/12.2.0' not found
ld: warning: search path '/opt/gfortran/lib' not found
ld: library 'gfortran' not found
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make: *** [Matrix.so] Error 1
ERROR: compilation failed for package ‘Matrix’
一般人看到了这样的报错信息肯定是非常头大,有gcc,gfortran,clang这些可能导致报错的原因。
关于Homebrew
Homebrew 是一款用于在 macOS 上安装和管理软件包的包管理器。它使得在 macOS 系统上安装、更新和删除软件变得更加简单。 Homebrew 规则和约定:
- 早期的Homebrew 默认将软件安装在
/usr/local
目录下,而不是系统默认的/usr
目录。这有助于避免与系统自带软件发生冲突。 - 最近的 Homebrew 默认会软件包安装在
/opt/homebrew/Cellar
目录下,而 Homebrew 本身则安装在/opt/homebrew
目录中。 避免与系统目录产生冲突,并确保用户在维护和管理软件包时有更多的灵活性。 - Homebrew 不会要求超级用户权限(sudo),因此所有的软件包安装在用户的 home 目录下。
- Homebrew 会将软件包安装在独立的目录中,并使用符号链接来链接到
/usr/local
目录,以避免冲突和混乱。
建议查阅官方文档以获取最新信息:Homebrew 官方网站。
Mac电脑里面的gfortran和gcc有什么关系呢
gfortran
和 gcc
是 GNU Compiler Collection(GNU 编译器集合)的一部分,它们分别用于编译 Fortran 和 C/C++ 语言的代码。在 macOS 中,这两个编译器通常一起安装,并且在命令行中都可以使用。
gfortran
:gfortran
是 GNU Fortran Compiler 的缩写。- 用于编译和链接 Fortran 语言的源代码。
- 在终端中可以使用
gfortran
命令调用。
gcc
:gcc
是 GNU Compiler Collection 的缩写,是一个通用的编译器,支持多种编程语言,包括 C、C++、Fortran 等。- 在 macOS 上,
gcc
实际上是一个指向clang
(LLVM 编译器)的符号链接。 - 当你在终端中使用
gcc
命令时,实际上是在调用 LLVM 的 Clang 编译器。
在 macOS 中,由于默认情况下系统使用 LLVM 的 Clang 作为 C/C++ 编译器,gcc
实际上是一个指向 Clang 的符号链接。但是,为了兼容性和一些历史原因,gfortran
通常仍然是 GNU 的 Fortran 编译器。
如果我们使用Homebrew安装gcc
很简单的命令如下所示:
% brew install gcc
% brew reinstall gcc
==> Downloading https://ghcr.io/v2/homebrew/core/gcc/manifests/13.2.0-2
==> Pouring gcc--13.2.0.arm64_sonoma.bottle.2.tar.gz
/opt/homebrew/Cellar/gcc/13.2.0: 1,489 files, 364.3MB
==> Running `brew cleanup gcc`...
Disable this behaviour by setting HOMEBREW_NO_INSTALL_CLEANUP.
Hide these hints with HOMEBREW_NO_ENV_HINTS (see `man brew`).
如果解决前面的报错呢
首先需要定位到核心问题, 就是:
'/opt/gfortran/lib/gcc/x86_64-apple-darwin20.0/12.2.0' not found
然后我们电脑里面确实是已经使用Homebrew安装gcc的时候有了所需要的库文件:
ls -lh /opt/homebrew/Cellar/gcc/13.2.0/lib/gcc/current
创建报错信息提示的那个缺失的文件夹,然后把库文件复制过去即可
sudo mkdir -p /opt/gfortran/lib/gcc/x86_64-apple-darwin20.0/12.2.0
sudo cp /opt/homebrew/Cellar/gcc/13.2.0/lib/gcc/current/* /opt/gfortran/lib/gcc/x86_64-apple-darwin20.0/12.2.0
最后就成功啦,如下所示:
** help
*** installing help indices
** building package indices
** installing vignettes
** testing if installed package can be loaded from temporary location
** checking absolute paths in shared objects and dynamic libraries
** testing if installed package can be loaded from final location
** testing if installed package keeps a record of temporary installation path
* DONE (Matrix)
如果是其它操作系统呢
比如Windows,其实应该是会依赖于 rtools
如果是Ubuntu等Linux操作系统,应该是可以安装缺失的库文件,或者使用conda管理。