win builder未找到gcc

win builder未找到gcc,r,windows,gcc,R,Windows,Gcc,我已经构建了一个包含C/C++代码的R包。我现在正尝试在上测试此软件包。不幸的是,在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 foun

我已经构建了一个包含C/C++代码的R包。我现在正尝试在上测试此软件包。不幸的是,在
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
得到了类似的结果

因此,我在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
中的材料都包括在内,因为你会把R已经带到表中的东西都删掉。所有这些都是在写R扩展,但当然可以更清楚

我的实用建议是:取一个你知道的和喜欢的包,它在WinBuilder中有一个工作的R构建,然后修改它。如果您有权使用Rtools等访问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)
实际上是在引用这个隐藏的代码


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

你能把Makefile.win的内容包括进来吗?谢谢。事实上,编写R扩展可能更清晰。我看了另一个我喜欢的包(
dplyr
),它的代码似乎比我的要简单得多。My
makefile
递归调用六个不同的子目录,它们有自己的makefile。它们生成静态库,然后将这些库组装成可执行文件。我不知道如何用
Makevars
捕捉到这一点,尽管这可能是一个单独的问题。这很难。一些软件包可以做到这一点,而另一些软件包则将其分包到
configure
configure.win
。立即阅读。使用
Makevars.win
Makevars
无疑是解决方案。谢谢很高兴知道!如果您有一个从
Makevars
构建依赖包/库的好解决方案,那么它可能值得一篇博客文章或类似文章。。。因为这并不是很明显,也没有很好的记录。