Недавно я перешел на 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)
Я предлагаю вам изучить / следить за обсуждениями в списке r-sig-mac, а также здесь на SO (ищите, скажем, [rcpp] mavericks
).
Я подозреваю, что все, что вам нужно, это расширить свой CXX
а также CXXFLAGS
переменные сказать
CC=clang
CXX=clang++
CXXFLAGS=-stdlib=libc++ -std=c++11
плюс любые другие варианты, такие как -O3 -Wall -pedantic
,
Я получил пример для работы с моими 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