2015-05-11 2 views
5

У меня есть проект с большим компонентом на C++, который я смог успешно скомпилировать с clang на OSX (версия LLVM версии 6.1.0 (clang-602.0.49) (на основе LLVM 3.6.0svn .) Поскольку OSX не обеспечивает Fortran компилятор я установил gfortran через HomebrewСсылка OSX Homebrew Gfortran против libC++

компиляции работает отлично, однако я не могу связать скомпилированный 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++? Возможно ли это с помощью gfortran, предоставленного Homebrew? Какой был бы лучший способ решения этой проблемы? Должен ли я попытаться установить связь с clang ++?

+0

Вы попробовали '-lstdC++'? –

+0

Мне нужно было добавить -lC++ к компоновщику (см. Ответ ниже). – Pascal

+0

Я предположил, что вы пробовали это раньше ... –

ответ

3

Необходимо указать gfortran, чтобы связать его с clangs C++ library (по умолчанию он будет иметь библиотеку GNU C++).

Например, если у вас есть файл Fortran и C++, каждый составлен с учетом их соответствующих компиляторов (примечание: gfortran-mp-5 является GNU Fortran 5.1 обеспечивается MacPorts)

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++, который будет решать ваши неопределенные символы.

+0

Это также должно быть возможно наоборот ('clang ++ -lgfortran ... '), но на моем mac я не могу убедить clang ++ связываться с' libgfortran.3.dylib' (используя правильные флаги '-L' и' -l'. Работает с g ++, но не clang ++ для меня). – casey

+0

Спасибо! Это именно то, что я искал! – Pascal