win builder未找到gcc
我已经构建了一个包含C/C++代码的R包。我现在正尝试在上测试此软件包。不幸的是,在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
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
),它的代码似乎比我的要简单得多。Mymakefile
递归调用六个不同的子目录,它们有自己的makefile。它们生成静态库,然后将这些库组装成可执行文件。我不知道如何用Makevars
捕捉到这一点,尽管这可能是一个单独的问题。这很难。一些软件包可以做到这一点,而另一些软件包则将其分包到configure
和configure.win
。立即阅读。使用Makevars.win
和Makevars
无疑是解决方案。谢谢很高兴知道!如果您有一个从Makevars
构建依赖包/库的好解决方案,那么它可能值得一篇博客文章或类似文章。。。因为这并不是很明显,也没有很好的记录。