2016-07-11 40 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