Связывание проблем с boost :: program_options на OSX с использованием LLVM

У меня проблемы с прохождением фазы компоновки в моей программе на C ++ из-за проблем с Boost 1.49. Я перешел на C ++ (-std=c++11 -libc=libc++), который отлично работает для другого куска кода (который также использует boost). Boost был установлен с помощью homebrew с:

brew install boost --universal --with-mpi --with-icu

Беда начинается сboost::program_options, Я получаю ссылку ошибки, как это:

  "boost::program_options::validate(boost::any&, 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> > > > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >*, int)", referenced from:

... etc. ...

ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

Это немного странно, потому что выполнение nm для используемой библиотеки показывает, что символ, кажется, там:

nm -U /usr/local/lib/libboost_program_options-mt.dylib  | grep validate
0000000000019880 - 01 0000   FUN __ZN5boost15program_options8validateERNS_3anyERKSt6vectorISbIwSt11char_traitsIwESaIwEESaIS7_EEPSsi
0000000000019880 T __ZN5boost15program_options8validateERNS_3anyERKSt6vectorISbIwSt11char_traitsIwESaIwEESaIS7_EEPSsi
00000000000199e0 - 01 0000   FUN __ZN5boost15program_options8validateERNS_3anyERKSt6vectorISbIwSt11char_traitsIwESaIwEESaIS7_EEPbi
00000000000199e0 T __ZN5boost15program_options8validateERNS_3anyERKSt6vectorISbIwSt11char_traitsIwESaIwEESaIS7_EEPbi
0000000000019930 T __ZN5boost15program_options8validateERNS_3anyERKSt6vectorISsSaISsEEPSsi
0000000000019930 - 01 0000   FUN __ZN5boost15program_options8validateERNS_3anyERKSt6vectorISsSaISsEEPSsi
0000000000019c70 - 01 0000   FUN __ZN5boost15program_options8validateERNS_3anyERKSt6vectorISsSaISsEEPbi
0000000000019c70 T __ZN5boost15program_options8validateERNS_3anyERKSt6vectorISsSaISsEEPbi

Я уже пытался уговорить homebrew, чтобы скомпилировать надстройку с помощью clang вместо gcc, установив CXX и CXX_FLAGS соответственно перед установкой. Не уверен, что мне это удалось.

Указатели очень ценятся.

 Thomas Petit18 июн. 2012 г., 15:58
Тот же вопрос, что и:stackoverflow.com/questions/8454329/…

Ответы на вопрос(2)

Решение Вопроса

Вам нужно будет перекомпилировать boost с флагами clang и std11, библиотека libc ++ не совместима в двоичном формате с установленным libstdc ++ в OSX (очень ранняя версия gcc до перехода на gpl3). Если ваша версия clang 3.1 или более поздняя, вы можете использовать ее (в противном случае измените c ++ 11 на c ++ 0x для более ранних версий).

./bootstrap.sh
mkdir build
sudo ./bjam toolset=clang cxxflags="-std=c++0x -stdlib=libc++" variant=release link=static threading=multi runtime-link=shared --build-dir=Build --layout=system --without-mpi --without-python install --prefix=/usr/local 

Вы можете, конечно, изменить любой из них, кроме как

toolset=clang cxxflags="-std=c++0x -stdlib=libc++"

Это должно работать для вас.

 Ion Tichy19 июн. 2012 г., 12:51
Привет, спасибо за указатель. Мысли столько же. Тем не менее, я не могу заставить Boost сейчас скомпилировать динамические библиотеки для меня. Я попробовал это: "sudo ./bjam toolset = clang cxxflags =" -std = c ++ 11 -stdlib = libc ++ & quot; вариант = ссылка на выпуск = разделяемая нить = многопользовательская ссылка = общая - build-dir = сборка --layout = система --without-mpi - без установки Python --prefix = / usr / local & apos; но получил только статичные.
 Ion Tichy24 июн. 2012 г., 22:57
Я наконец получил ответ через Boost.Build-Forum:boost.2283326.n4.nabble.com/…  Короче говоря: я пропустил «флаги ссылок»; при вызове bjam: ./b2 toolset = clang cxxflags = & quot; -std = c ++ 11 -stdlib = libc ++ & quot; linkflags = & Quot; -stdlib = Libc ++ & Quot;

Я хотел бы поделиться своим (в меру болезненным) опытом создания Boost 1.54 на Mac OS X 10.8.5 с clang 5.0.0, поставляемым Xcode 5.0. Если вам нужны возможности C ++ 11, очень важно скомпилировать и связать сclang++, не сclang.

Иллюстрация: возьмите следующую простую программу:

#include <iostream>
#include <string>

int main(int argc, char *argv[]) {
    std::string str = "OK";
    std::cout << str << std::endl;
    return 0;
}

Может быть построен с помощью следующей команды:

clang++ -std=c++11 -stdlib=libc++ clangstr.cc -o clangstr

однако, если вы попробуете это вместо этого:

clang -std=c++11 -stdlib=libc++ clangstr.cc -o clangstr

тогда вы получите ошибки компоновщика. Обратите внимание, чтоclang manpage говорит, что язык выбирается-std= вариант, но этого явно недостаточно.

Урок в том, что мы должны сказатьbjam явно использоватьclang++ при компиляции Boost с поддержкой C ++ 11.

Следующийэтот очень полезный постЯ положил следующее в мойtools/build/v2/user-config.jam:

using clang : 11
    : "/usr/bin/clang++"
    : <cxxflags>"-std=c++11 -stdlib=libc++ -ftemplate-depth=512" <linkflags>"-stdlib=libc++"
    ;

Потом я побежал./b2 cleanЗатем я собрал Boost с помощью следующей команды:

mkdir -p build/clangstage/
./b2 -j8 --build-dir=build --stagedir=build/clangstage toolset=clang-11 define=BOOST_SYSTEM_NO_DEPRECATED variant=release threading=multi address-model=64 stage

Это создает 64-битные статические и динамические библиотеки с поддержкой многопоточности. Если вам нужен другой набор, измените команду выше соответственно.

Ваш ответ на вопрос