r - win-builder 找不到 gcc

标签 r windows gcc

我构建了一个包含 C/C++ 代码的 R 包。我现在正在尝试在 win-builder 上测试这个包.不幸的是,在 00install.out 中返回了以下错误:

* installing *source* package 'mypackage' ...
** libs
  running 'src/Makefile.win' ...
/usr/bin/make --directory=lib/mylib/
gcc -g -Wall -fPIC -c mycode.c
make[1]: gcc: Command not found
make[1]: *** [mycode.o] Error 127
make: *** [mylib] Error 2
Warning: running command 'make --no-print-directory -f "Makefile.win"' had status 2
ERROR: compilation failed for package 'mypackage'
* removing 'd:/RCompile/CRANguest/R-release/lib/mypackage'

尝试使用 gccgcc.execc 产生了类似的结果。

据此,我根据these instructions在Windows虚拟机上搭建了测试环境。 .在此环境中从命令行对代码运行 R CMD INSTALL . 导致代码编译和包安装没有问题。 (运行 R CMD build 。 也没有产生任何错误。)

win-builder 是怎么回事,我怎样才能在它上面实现编译?

或者,更重要的是,无论是否在 win-builder 上运行,能够在 Windows 上构建包就足够了吗?

我的Makefile.win如下:

export CCOMP = gcc
export CPPCOMP = c++
export ADD_CC_FLAGS = -O3
APP_DIR = ./apps/myapp
LIB_DIR = ./lib/mylib

.PHONY: all $(APP_DIR) $(LIB_DIR)

all: $(APP_DIR) $(LIB_DIR)

$(APP_DIR) $(LIB_DIR): mylib
  $(MAKE) --directory=$@

$(APP_DIR): $(LIB_DIR) mylib

mylib:
  $(MAKE) --directory=lib/mylib

echo %PATH% 插入到 mylib 目标下的 make 文件中产生:

Makefile.win:24: *** missing separator.  Stop.

最佳答案

你在这里得到一个模糊的错误,因为你包含了一个文件 Makefile.win

但是 make 的语义,如果找到这样的文件,它将被使用......这不是你在这里想要的。 R 构建它自己的 Makefile.win 并且您应该只提供要包含的片段——必须 称为Makevars .win.

这是第一条规则。第二条规则是不要包含您将包含在 Makefile 中的所有 Material ——因为您会破坏 R 已经提供给表格的内容。所有这些都在 Writing R Extensions 中,但当然可以更清楚。

我的务实建议:拿一个你知道并喜欢的包,它在 win-builder 中有一个有效的 R 构建,并修改它。如果您可以使用 Rtools 等 pp 访问 R 系统,则可以在本地进行测试。


从 OP 编辑​​:

我需要编译一个依赖于多个库的可执行文件。库代码在 src/libs 中,可执行文件的代码在 src/apps 中。我确保在每个子目录中运行 make 并设置 src/apps/Makefile 以使用相对路径来提取 src/libs 的结果.当时唯一的问题是让整个链条运行起来。为此,我创建了一个文件 src/Makevars.win,它具有以下结构:

.PHONY: all myprogram sublib1 sublib2

all: sublib1 sublib2 myprogram

myprogram: sublib1 sublib2
  @(cd apps/myprogram && $(MAKE) CXX="$(CXX)" CC="$(CC)" CFLAGS="$(CFLAGS) $(CPICFLAGS)" AR="$(AR)" RANLIB="$(RANLIB)")

sublib1:
  @(cd lib/sublib1    && $(MAKE) CXX="$(CXX)" CC="$(CC)" CFLAGS="$(CFLAGS) $(CPICFLAGS)" AR="$(AR)" RANLIB="$(RANLIB)")

sublib2:
  @(cd lib/sublib2    && $(MAKE) CXX="$(CXX)" CC="$(CC)" CFLAGS="$(CFLAGS) $(CPICFLAGS)" AR="$(AR)" RANLIB="$(RANLIB)")

据我了解,Makevars.win 嵌入到 R 生成的动态生成的 Makefile 中。所以,$(CC) 实际上引用了这个隐藏代码。

(可能有更聪明的方法来做到这一点。)

关于r - win-builder 找不到 gcc,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38314467/

相关文章:

R - 从自己的函数将变量保存到数据帧

r - 合并 data.table 时出错 - 编码警告消息

在 Windows 上使用 C 清除命令提示符

c++ - 窗口界面而不是 c 中的控制台

c - 如何查看代码块中的汇编代码?

c - VC++获取头文件路径

r - 如何使用 R 更改 png 文件的大小

c++ - 在 Windows 上使用 Rcpp 创建 .dll 文件和编译 C++ 代码

windows - 在 PowerShell 中?

c - location pragmas需要什么