Пример сборки 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)

person Hans Roggeman    schedule 18.01.2014    source источник
comment
Я только что заметил, что есть проект Rcpp11. Означает ли это, что Rcpp и RInside не будут хорошо работать с C++11? Я получаю ту же ошибку, когда устанавливаю --std=c++98 в Netbeans. Я попробую понизить версию Xcode.   -  person Hans Roggeman    schedule 18.01.2014
comment
Нет. Rcpp не мог / не может, пока не выйдет версия R 3.1.0, использовать C+11, поскольку CRAN не принял бы его. Таким образом, наше использование его в Rcpp полностью опционально, но см., например, пару сообщений по Rcpp и C++11 в галерее Rcpp. У нас даже есть атрибут для включения C++11 по требованию. Просто пока не загружайте код C++11 в CRAN.   -  person Dirk Eddelbuettel    schedule 19.01.2014


Ответы (2)


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

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

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

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

person Dirk Eddelbuettel    schedule 18.01.2014
comment
Я уже пробовал это, и это не сработало как через ~/.R/Makevars, так и через переменные среды. Я перешел на XCode 4.6.3 и отдельно устанавливаю g++. Посмотрим, что из этого выйдет. - person Hans Roggeman; 19.01.2014
comment
Хм. RInside не должен требовать большего, чем Rcpp, так что это немного озадачивает. Возможно, попробуйте список rcpp-devel. - person Dirk Eddelbuettel; 19.01.2014
comment
Вызов make, который вы цитируете, похоже, не связывает библиотеку C++. Может быть, вам нужен дополнительный LDLIBS, чтобы установить его? Я думаю, что это должно работать с XCode, но, как я уже сказал, я сам не являюсь пользователем Mac. - person Dirk Eddelbuettel; 19.01.2014
comment
изменения clang++ заставляют Rcpp работать в R (например, evalCpp('2LL')), но примеры RInside отказались связываться. Это может быть связано с некоторым конфликтом с Xcode 5.0.2/C++11/RInside. - person Hans Roggeman; 19.01.2014
comment
Это имеет большой смысл, я попробую вручную и опубликую обновление. - person Hans Roggeman; 19.01.2014
comment
У меня возникла та же проблема с этим вызовом: 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=libc++ -std=c++11 -mtune=native -g -O3 -Wall -pedantic -Wconversion -Wall -I/usr/local/include rinside_callbacks0.cpp IGNORING THIS BECAUSE TOO LONG FOR COMMENT -o rinside_callbacks0 , если я перейду на -std=c++98, я получу ту же проблему (хотя теперь я перешел на Xcode 4.6.3). - person Hans Roggeman; 19.01.2014
comment
Попробуйте hello_world.cpp (без R, Rcpp или RInside), используя, скажем, std::string и std::cout, и запишите туда, что вам нужно. Настройте переменную makefile, чтобы обеспечить это, и поиграйте с порядком связанных библиотек. Здесь нет никакой магии — вам нужно предоставить библиотеки C++, чтобы это работало. - person Dirk Eddelbuettel; 19.01.2014

Я получил пример для работы с моим 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
person Hans Roggeman    schedule 19.01.2014