簡體   English   中英

Rcpp庫無法在Ubuntu上構建(找不到編譯器)

[英]Rcpp Library Won't Build (Can't find Compiler) on Ubuntu

我有一個依賴於Rcpp的軟件包,並使用其他兩個從src/子目錄編譯的庫。 該軟件包可以使用clang編譯器在Mac OSX上很好地構建。 但是,在RStudio Ubuntu服務器上,它無法構建。 構建的前兩個步驟(在要鏈接的子目錄中創建靜態庫)運行良好,我可以看到明智的構建命令,如下所示:

g++ -Wall -I../../inst/include/ --std=c++11 -lhts -L../htslib/ -lz -lm -c -o someLibFile.o someLibFile.cpp

但是,在構建過程的最后一步,它嘗試構建Rcpp代碼並綁定到庫,由於某種原因,它似乎無法完全將編譯器命令放在前面( g++ ),並且僅輸出命令。

 -o mypackage.so RcppExports.o temp.o -lhts -lpbbam -Lpbbam/ -L/htslib/ -Lpbbam/ -L/mnt/software/r/R/3.1.1/usr/lib/R/lib -lR

相比之下,在Mac上,它的構建就很好,在此最終命令的前面附加了clang++和其他標志:

 clang++ -std=c++11 -dynamiclib -Wl,-headerpad_max_install_names -undefined dynamic_lookup -single_module -multiply_defined suppress -L/Library/Frameworks/R.framework/Resources/lib -L/usr/local/lib -o pbbamr.so LoadData.o RcppExports.o temp.o -lhts -lpbbam -Lpbbam/ -Lhtslib/ -Lpbbam/ -F/Library/Frameworks/R.framework/.. -framework R -Wl,-framework -Wl,CoreFoundation

在這一步如何在Ubuntu上使用g ++編譯器? 我有一個自定義的Makevars文件,但是它只是用來在子目錄中構建依賴項的,所以我不知道為什么這會引起任何問題(因為它在Mac OSX上有效)。

更多信息

如果我刪除Makevars文件,似乎可以找到編譯器。 但是,我正在使用的Makevars文件本質上是R擴展指南中給出的示例的直接副本,並帶有一個啟用C ++ 11的附加功能:

 CXX_STD = CXX11
.PHONY: all mylibs

all: $(SHLIB)
    $(SHLIB): mylibs

mylibs:
    (cd subdir; make)

刪除CXX_STD行后,確實CXX_STD編譯器粘貼在命令的前面。

簡述:

  • 您的R安裝是什么? 您可能應該運行Michael通過CRAN提供的二進制文件。 它們基於我的Debian上傳; 我也在一堆機器上運行這些
  • 原因是R通過$RHOME/etc/Makefconf “記住”其編譯時設置。 這應該只是CXX=g+=
  • 當您安裝r-base-dev (來自Ubuntu或CRAN的較新版本)時,您還將獲得build-essential軟件包以及所有常見的依賴項。 這樣就可以了。

但是,如果您正在做一些特殊的或本地的事情,那么您就必須應對本地的變化。 基本的Ubuntu安裝程序可用於成千上萬的人和日常工作,包括Travis為無數GitHub存儲庫構建的版本。

這是由於使用過時的/不尋常的R安裝導致的,該安裝對C ++ 11的支持較差。 解決他的最佳方法是升級到R的最新版本,或使用標准R安裝( sudo apt-get install r-base-dev )。 不良的解決方法如下所述。

問題原因和不良解決方法

當編寫使用C ++ 11,一個常設置ř擴展CXX_STD = CXX11Makevars文件或列表SystemRequirements: C++11DESCRIPTION的文件。 這些將觸發R使用Makeconf文件(位於file.path(R.home(), "etc/Makeconf") )以下標志設置的編譯器。

CXX1X
CXX1XFLAGS
CXX1XPICFLAGS
CXX1XSTD

請注意,其中一些可能已在此文件中設置,但並非所有的文件都可能存在問題。 如果這些設置有問題或未設置,R似乎使用空字符串“”作為C ++代碼的編譯器/鏈接器,從而導致上面顯示的問題,其中未給出任何編譯器參數。

如果不是必須進行升級,而您需要在已知的機器上進行部署,則一種解決方法是通過制作一個更加特殊的Makevars文件來手動設置C ++ 11。 例如,您可以:

  • Makevars文件中刪除CXX_STD=CXX11行。
  • DESCRIPTION文件中刪除SystemRequirements: C++11
  • PKG_CPPFLAGSPKG_CFLAGSPKG_CXXFLAGS或用於編譯代碼的任何變量添加--std=c++11以及任何其他要求,以手動設置所需的標志(假設機器的編譯器確實支持C ++ 11) 。

上面的解決方案不是特別健壯,但是可以在無法升級機器的情況下用作解決方法。

感謝@DirkEddelbuettel不僅編寫了Rcpp而且願意在StackOverflow上支持它並幫助解決此類問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM