我构建了一个包含 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'
尝试使用 gcc
、gcc.exe
和 cc
产生了类似的结果。
据此,我根据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/