R语言问题集锦

R语言中GCC编译的问题(续)

2018-08-20  本文已影响219人  xuzhougeng

这篇文章承接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/

顺利安装!

上一篇下一篇

猜你喜欢

热点阅读