2014-01-18 60 views
2

我最近通過OS X 10.9.1上的命令行工具移至C++ 11和Xcode 5,使用Homebrew安裝了boost 1.55,並更改了編譯器從g ++到clang ++(如本文中提到的:Error when with Xcode 5.0 and Rcpp)。在R中運行時,編譯器會更改固定的Rcpp。但是,我在編譯RInside示例時遇到了問題(它曾經工作得很好)。在OS X上使用clang ++構建RInside示例小牛無法在鏈接上找到STL標準庫

我重新下載了RInside並解壓tar,進入了examples/standard目錄,並做了make cleanmake all。它看起來像任何STL沒有被鏈接到這個目錄。如何使RInside鏈接到Makefile中相應的STL?

我正在使用來自Netbeans的STL在一個單獨的項目和建築使用鏗鏘++在那裏工作。但是,當我在Netbeans上嘗試一個RInside項目時,我遇到了同樣的問題:Undefined symbols for architecture x86_64。我需要在某處下載64位版本的STL或者RInside嗎?

我是否還需要更新/更改某個地方的配置,我下載了一個錯誤的軟件包,還是需要更改示例的Makefile中的設置?

這裏是make all第一個電話:

clang++ -I/Library/Frameworks/R.framework/Resources/include -I/Library/Frameworks/R.framework/Versions/3.0/Resources/library/Rcpp/include -I/Library/Frameworks/R.framework/Versions/3.0/Resources/library/RInside/include -mtune=native -g -O2 -Wall -pedantic -Wconversion -Wall -I/usr/local/include rinside_callbacks0.cpp -F/Library/Frameworks/R.framework/.. -framework R -L/Library/Frameworks/R.framework/Resources/lib -lRblas -L/Library/Frameworks/R.framework/Resources/lib -lRlapack /Library/Frameworks/R.framework/Versions/3.0/Resources/library/Rcpp/lib/libRcpp.a /Library/Frameworks/R.framework/Versions/3.0/Resources/library/RInside/lib/libRInside.a -o rinside_callbacks0 

輸出的開頭:

Undefined symbols for architecture x86_64: 
    "std::string::find_last_of(char, unsigned long) const", referenced from: 
     demangler_one(char const*) in libRcpp.a(api.o) 
    "std::string::find(char const*, unsigned long) const", referenced from: 
     short_file_name(char const*) in libRcpp.a(api.o) 
    "std::string::size() const", referenced from: 
     std::basic_string<char, std::char_traits<char>, std::allocator<char> > std::operator+<char, std::char_traits<char>, std::allocator<char> >(char const*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) in libRcpp.a(api.o) 
     MemBuf::add(std::string const&) in libRInside.a(MemBuf.o) 
    "std::string::c_str() const", referenced from: 
     RInside::parseEval(std::string const&, SEXPREC*&) in libRInside.a(RInside.o) 
     SEXPREC* Rcpp::pairlist<Rcpp::Function, Rcpp::traits::named_object<SEXPREC*>, Rcpp::traits::named_object<SEXPREC*> >(Rcpp::Function const&, Rcpp::traits::named_object<SEXPREC*> const&, Rcpp::traits::named_object<SEXPREC*> const&) in libRInside.a(RInside.o) 
     short_file_name(char const*) in libRcpp.a(api.o) 
     string_to_try_error(std::string const&) in libRcpp.a(api.o) 
     Rcpp::RObject::AttributeProxy::set(SEXPREC*) const in libRcpp.a(api.o) 
     demangle(std::string const&) in libRcpp.a(api.o) 
     Rcpp::RObject::AttributeProxy::get() const in libRcpp.a(api.o) 

,並在錯誤信息的末尾:

ld: symbol(s) not found for architecture x86_64 
clang: error: linker command failed with exit code 1 (use -v to see invocation) 
+0

我只注意到有一個Rcpp11項目。這是否意味着Rcpp和RInside不會在C++ 11中表現出色?當我在Netbeans中設置'--std = C++ 98'時,我得到了同樣的錯誤。我會嘗試降級我的Xcode。 –

+1

編號Rcpp不能/不能,直到R 3.1.0發佈時使用C + 11,因爲CRAN不會接受它。因此,我們在Rcpp中使用它完全是選項 - 但請參閱例如[Rcpp Gallery上的Rcpp和C++ 11上的幾篇文章](http://gallery.rcpp.org/tags/c++11 /)。我們甚至有一個屬性可以根據需要轉換C++ 11。只是不要將C++ 11代碼上傳到CRAN。 –

回答

1

我在OS X 10.9.1上降級到Xcode 4.6.3並使用鏗鏘++和C++ 11(對Netbeans中的設置沒有其他更改)後,從我的Netbeans中獲得了該示例。它也使用C++ 98在g ++(或clang ++)上工作。它看起來像Xcode 5中的默認庫是libc++(支持C++ 11的LLVM C++標準庫),但我需要鏈接的是libstdc++(GNU C++標準庫 - 用於早期Xcode版本的默認庫)。在改變〜/ .R/Makevars文件CXXFLAGS="-stdlib=libstdc++ -std=c++11 -mtune=native -g -O3 -Wall -pedantic -Wconversion"以及clang++更改後,我得到了要構建的示例。我通過重新升級到Xcode 5並在Netbeans中得到相同的錯誤,但不在樣本上(現在由於libstdc++標誌而生成)來確認行爲。當我在Netbeans中添加-stdlib=libstdc++作爲附加標誌時,它再次構建。

就像一個人如果有人遇到構建示例的問題。 NetBeans中的編譯和鏈接步驟是:

"/Applications/Xcode.app/Contents/Developer/usr/bin/make" -f nbproject/Makefile-Debug.mk QMAKE= SUBPROJECTS= .build-conf 
"/Applications/Xcode.app/Contents/Developer/usr/bin/make" -f nbproject/Makefile-Debug.mk dist/Debug/GNU-MacOSX/callingrproject 
mkdir -p build/Debug/GNU-MacOSX 
rm -f "build/Debug/GNU-MacOSX/main.o.d" 
clang++ -stdlib=libstdc++ -c -g -I. -I/Library/Frameworks/R.framework/Resources/include -I/Library/Frameworks/R.framework/Resources/library/Rcpp/include -I/Library/Frameworks/R.framework/Resources/library/RInside/include -I/usr/local/Cellar -std=c++98 -MMD -MP -MF "build/Debug/GNU-MacOSX/main.o.d" -o build/Debug/GNU-MacOSX/main.o main.cpp 
mkdir -p dist/Debug/GNU-MacOSX 
clang++ -o dist/Debug/GNU-MacOSX/callingrproject build/Debug/GNU-MacOSX/main.o -L/Library/Frameworks/R.framework/Resources/lib -L/Library/Frameworks/R.framework/Resources/library/Rcpp/lib -L/Library/Frameworks/R.framework/Resources/library/RInside/lib -L/Library/Frameworks/R.framework/Libraries -L/Library/Frameworks/R.framework/Resources/lib -L/Library/Frameworks/R.framework/Resources/library -L/Library/Frameworks/R.framework/Resources/modules -lRcpp -lRInside -lRlapack -lRblas -F/Library/Frameworks/R.framework/.. -framework R -stdlib=libstdc++ 

的例子構建爲:

clang++ -I/Library/Frameworks/R.framework/Resources/include -I/Library/Frameworks/R.framework/Versions/3.0/Resources/library/Rcpp/include -I/Library/Frameworks/R.framework/Versions/3.0/Resources/library/RInside/include -stdlib=libstdc++ -std=c++11 -mtune=native -g -O3 -Wall -pedantic -Wconversion -Wall -I/usr/local/include rinside_callbacks0.cpp -F/Library/Frameworks/R.framework/.. -framework R -L/Library/Frameworks/R.framework/Resources/lib -lRblas -L/Library/Frameworks/R.framework/Resources/lib -lRlapack /Library/Frameworks/R.framework/Versions/3.0/Resources/library/Rcpp/lib/libRcpp.a /Library/Frameworks/R.framework/Versions/3.0/Resources/library/RInside/lib/libRInside.a -o rinside_callbacks0 
1

我建議你研究/遵循關於r-sig-mac列表以及SO的討論(搜索,例如[rcpp] mavericks)。

我懷疑你需要的是擴大你的CXXCXXFLAGS變量說

CC=clang 
CXX=clang++ 
CXXFLAGS=-stdlib=libc++ -std=c++11 

加任何其他選項,如-O3 -Wall -pedantic

+0

我已經嘗試過這些,並且通過〜/ .R/Makevars和環境變量都無法工作。我降級到XCode 4.6.3,我正在分別安裝g ++。我們會看到它出來的。 –

+0

嗯。 RInside不需要比Rcpp多得多,所以這有點令人費解。也許可以試試rcpp-devel列表。 –

+0

您引用的'make'調用似乎並不鏈接C++庫。也許你需要額外的LDLIBS來設置它?我認爲這應該適用於XCode,但正如我所說:我自己不是Mac用戶。 –