【问题标题】:Link OSX Homebrew Gfortran against libc++将 OSX Homebrew Gfortran 与 libc++ 链接
【发布时间】:2015-05-11 17:41:05
【问题描述】:

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

编译工作正常,但是我无法将已编译的 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++ 链接吗?

【问题讨论】:

  • 你试过-lstdc++吗?
  • 我需要将 -lc++ 添加到链接器中(请参阅下面的 casey 的回答)。
  • 我猜你之前试过...
  • 不幸的是我不熟悉 GFortran 并尝试了 clang C++ 标志的不同变体....

标签: macos fortran libc++


【解决方案1】:

您需要明确告诉 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++,这将解析您未定义的符号。

【讨论】:

  • 这也应该可以反过来 (clang++ -lgfortran ...) 但是在我的 Mac 上我无法说服 clang++ 与 libgfortran.3.dylib 链接(使用正确的 -L-l 标志。作品使用 g++ 但对我来说不是 clang++)。
  • 谢谢!这正是我想要的!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多