这篇文章承接R语言中GCC编译的问题,这篇文章主要解决我在Linux系统上安装"expm"出现的问题。
这个问题非常的有趣,因为我在两台服务器分别安装同一个包,其中一台没有任何问题,而另一台则失败,尽管操作系统都是“CentOS Linux release 7.4.1708 (Core)”。不过我知道,一定还有一些差异我没有发现,有可能是R的版本不同,有可能是安装R所用的GCC版本不同,但是这种差异就算知道了也不像去解决,我可不想为了一个R包重装系统。
那么如何解决这个问题呢?策略就是手动安装了。
让我们先下载这个R包并解压
wget https://mirrors.tuna.tsinghua.edu.cn/CRAN/src/contrib/expm_0.999-2.tar.gz
tar xf expm_0.999-2.tar.gz
然后找到locale.h
中报错行, 也就是从libintl.h
中调用的dgettext
报错了
#include <R.h>
#ifdef ENABLE_NLS
#include <libintl.h>
#define _(String) dgettext ("expm", String)
#else
#define _(String) (String)
#endif
这个libintl.h
凭我本能的直觉我认为是应该是在/usr/include/
下, 使用VIM打开并查找"LC_MESSAGES"
...
/* We need LC_MESSAGES for `dgettext'. */
# include <locale.h>
...
这行代码告诉我们这个"LC_MESSAGES"在locale.h
下, 但是我发现在locale.h
里面是有定义的
/* These are the possibilities for the first argument to setlocale.
The code assumes that the lowest LC_* symbol has the value zero. */
#define LC_CTYPE __LC_CTYPE
#define LC_NUMERIC __LC_NUMERIC
#define LC_TIME __LC_TIME
#define LC_COLLATE __LC_COLLATE
#define LC_MONETARY __LC_MONETARY
#define LC_MESSAGES __LC_MESSAGES
#define LC_ALL __LC_ALL
#define LC_PAPER __LC_PAPER
#define LC_NAME __LC_NAME
#define LC_ADDRESS __LC_ADDRESS
#define LC_TELEPHONE __LC_TELEPHONE
#define LC_MEASUREMENT __LC_MEASUREMENT
#define LC_IDENTIFICATION __LC_IDENTIFICATIO
于是我崩溃了。
突然间我灵机一闪,为啥不直接把这个定义添加到原来的locale.h
里呢? 于是我在locale.h
里增加了一行,改为
/* Localization */
#define LC_MESSAGES "en_US.UTF-8"
#include <R.h>
#ifdef ENABLE_NLS
#include <libintl.h>
#define _(String) dgettext ("expm", String)
#else
#define _(String) (String)
#endif
最后用R CMD INSTALL
安装
R CMD INSTALL expm/
顺利安装!