链接OSX Homebrew Gfortran与libc ++

时间:2015-05-11 17:41:05

标签: macos fortran libc++

我有一个带有大型C ++组件的项目,我能够使用OSX上的clang成功编译(Apple LLVM版本6.1.0(clang-602.0.49)(基于LLVM 3.6.0svn)。由于OSX没有提供我通过Homebrew安装gfortran的Fortran编译器。

编译工作正常,但我无法将编译的Fortran代码与之前编译的C ++代码链接:我收到以下错误:

$ make fortran
Undefined symbols for architecture x86_64:
  "std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::compare(char const*) const", referenced from:
      DataFieldInfo::FromJSON(JSONNode const&) in [...]
  "std::__1::__vector_base_common<true>::__throw_length_error() const", referenced from:
      std::__1::vector<char, std::__1::allocator<char> >::allocate(unsigned long) in [...]
      void std::__1::vector<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::allocator<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > >::__push_back_slow_path<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const>(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&) in [...]
      void std::__1::vector<JSONNode, std::__1::allocator<JSONNode> >::__push_back_slow_path<JSONNode const>(JSONNode const&) in [...]
[...]

这向我表明我在Fortran和C ++部分之间存在链接问题。

如何将Fortran部分与libc ++链接? Homebrew提供的gfortran可以实现吗?解决这个问题的最佳方法是什么?我应该尝试使用clang ++进行链接吗?

1 个答案:

答案 0 :(得分:4)

你需要明确地告诉gfortran链接clangs c ++库(它将默认为GNU c ++库)。

例如,如果你有一个Fortran和C ++文件,每个文件都用它们各自的编译器编译(注意:gfortran-mp-5是由macports提供的GNU Fortran 5.1)

gfortran-mp-5 -c gfortest.f90
clang++ -c clangtest.cc

您可以将结果对象与gfortran链接在一起,如下所示:

gfortran-mp-5 -lc++ -o test-f gfortest.o clangtest.o

-lc++标志告诉gfortran链接libc++,它将解析您未定义的符号。