RInside пример сборки с использованием clang ++ на OS X Mavericks не может найти стандартную библиотеку STL при связывании

Недавно я перешел на C ++ 11 и Xcode 5 с инструментами командной строки в OS X 10.9.1, установил boost 1.55 с помощью Homebrew и изменил компилятор с g ++ на clang ++ (как упоминалось в этом посте: Ошибка при использовании Xcode 5.0 и Rcpp). Изменения в компиляторе исправили Rcpp при работе в R. Но у меня проблемы с компиляцией примеров RInside (которые раньше работали просто отлично).

Я заново загрузил RInside и разархивировал tar, зашел в каталог examples / standard и сделал make clean а также make all, Похоже, что любой STL не связан с этим каталогом. Как мне сделать RInside ссылку на соответствующий STL в Makefile?

Я использую STL от Netbeans в отдельном проекте, и там работает сборка с использованием clang ++. Однако, когда я пробую проект RInside на Netbeans, у меня возникает та же проблема: 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)

2

Решение

Я предлагаю вам изучить / следить за обсуждениями в списке r-sig-mac, а также здесь на SO (ищите, скажем, [rcpp] mavericks).

Я подозреваю, что все, что вам нужно, это расширить свой CXX а также CXXFLAGS переменные сказать

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

плюс любые другие варианты, такие как -O3 -Wall -pedantic,

1

Другие решения

Я получил пример для работы с моими Netbeans после понижения до Xcode 4.6.3 на OS X 10.9.1 и использования clang ++ и C ++ 11 (никаких других изменений настроек в Netbeans). Он также работал на g ++ (или clang ++) с использованием C ++ 98. Похоже, что библиотека по умолчанию в Xcode 5 была libc++ (LLVM C ++ стандартная библиотека с поддержкой C ++ 11), но мне нужно было связать это libstdc++ (Стандартная библиотека GNU C ++ — библиотека по умолчанию для более ранних версий Xcode). После изменения этого в файле ~ / .R / Makevars CXXFLAGS="-stdlib=libstdc++ -std=c++11 -mtune=native -g -O3 -Wall -pedantic -Wconversion" вместе с clang++ изменить я получил примеры для сборки. Я подтвердил поведение путем повторного обновления до Xcode 5 и получения той же ошибки в Netbeans, но не в примерах (которые теперь создаются из-за libstdc++ флаг). Когда я добавил -stdlib=libstdc++ в качестве дополнительного флага в Netbeans он строится снова.

Так же, как к вашему сведению, если кто-то столкнется с проблемой построения примеров. В 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

По вопросам рекламы [email protected]