2

我最近在 OS X 10.9.1 上使用命令行工具迁移到 C++11 和 Xcode 5,使用 Homebrew 安装了 boost 1.55,并将编译器从 g++ 更改为 clang++(如本文所述:使用 Xcode 5.0 和 Rcpp 时出错) . 在 R 中运行时,编译器更改了固定的 Rcpp。但是我在编译 RInside 示例时遇到了问题(以前可以正常工作)。

我重新下载了 RInside 并解压缩了 tar,转到示例/标准目录并做了一个make cleanmake all. 看起来任何 STL 都没有从这个目录链接到。如何使 RInside 链接到 Makefile 中的适当 STL?

我在一个单独的项目中使用来自 Netbeans 的 STL,并在那里使用 clang++ 进行构建。但是,当我在 Netbeans 上尝试 RInside 项目时,我遇到了同样的问题:Undefined symbols for architecture x86_64. 我是否需要在某处下载 STL 或 RInside 的 64 位版本?

我是否仍然需要在某处更新/更改配置,我是否下载了错误的包,或者它是否是 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)
4

2 回答 2

1

我建议您学习/关注关于 r-sig-mac 列表的讨论以及在 SO 上的讨论(搜索,比如说,[rcpp] mavericks)。

我怀疑你所需要的只是扩展你的CXXCXXFLAGS变量来说

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

加上任何其他选项,例如-O3 -Wall -pedantic.

于 2014-01-18T20:33:36.040 回答
1

在 OS X 10.9.1 上降级到 Xcode 4.6.3 并使用 clang++ 和 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++标志而构建)确认了该行为。当我-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
于 2014-01-19T12:18:40.443 回答