![](/img/trans.png)
[英]Ubuntu recognizes executable as shared library and won't run it by clicking
[英]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
編譯器粘貼在命令的前面。
簡述:
$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 = CXX11
在Makevars
文件或列表SystemRequirements: C++11
中DESCRIPTION
的文件。 這些將觸發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_CPPFLAGS
, PKG_CFLAGS
, PKG_CXXFLAGS
或用於編譯代碼的任何變量添加--std=c++11
以及任何其他要求,以手動設置所需的標志(假設機器的編譯器確實支持C ++ 11) 。 上面的解決方案不是特別健壯,但是可以在無法升級機器的情況下用作解決方法。
感謝@DirkEddelbuettel不僅編寫了Rcpp
而且願意在StackOverflow上支持它並幫助解決此類問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.