2016-07-11 21 views
1

我已经构建了一个包含C/C++代码的R包。我现在试图在win-builder上测试这个包。不幸的是,返回以下错误00install.outgcc not win-builder

* 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.exe尝试,cc产生类似的结果。

因此,我根据these instructions在Windows虚拟机上设置了测试环境。在此环境中的命令行上运行代码R CMD INSTALL .,导致代码编译和程序包安装无问题。 (运行R CMD build .也没有发生任何错误。)

怎么了双赢建设者,我该如何实现编译?

或者更重要的是,能够在Windows上构建足够的软件包,无论它是否适用于win-builder?

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) [email protected] 

$(APP_DIR): $(LIB_DIR) mylib 

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

插入echo %PATH%mylib目标下生成文件产生:

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

你可以包含你的Makefile.win内容吗? – nrussell

+0

@nrussell:已添加。 – Richard

回答

3

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

但是make的语义,如果找到这样一个文件,它将被使用......这就是而不是你想在这里。 R建立它自己的Makefile.win,你应该只提供一个片段被包括在内 - 其中必须被称为Makevars.win

这是规则第一。第二条规则是不包括你将包含在Makefile中的所有材料 - 因为你会打破R已经带来的东西。所有这些都在Writing R Extensions,但当然可以更清楚。

我的务实建议是:把你认识并喜欢的软件包打包在win-builder中,并对其进行修改。您可以从OP本地测试你应该有Rtools等PP访问一个R系统


编辑:

我需要编译这依赖于几个库的可执行文件。库代码位于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被嵌入在动态生成的Makefile是R产生。所以,$(CC)实际上是参考这个隐藏的代码。

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

+0

谢谢。确实如此,写作R扩展可能会更清晰。我看了另一个我喜欢的软件包('dplyr'),看起来代码比我的简单得多。我的'makefile'递归调用六个不同的子目录,它们有自己的makefile。这些产生静态库,然后将其组装成可执行文件。我不知道如何使用'Makevars'来捕获这个问题,但也许这是一个单独的问题。 – Richard

+0

很难。有些软件包可以做到这一点 - 另外一些软件包则将其用于'configure'和'configure.win'。 –

+0

立即阅读[此链接](http://www.hep.by/gnu/r-patched/r-exts/R-exts_14.html#SEC14)。 – Richard