Boost на Darwin статически, включая libstdС++?

Почему код STL кажется статически связанным с динамическими библиотеками Boost в Darwin?

Когда я собираю Boost 1.42/1.46.1/1.49 на OS X с gcc 4.6.1 и toolset=darwin, я обнаруживаю, что полученные библиотеки статически включают много кода STL, такого как std::basic_string‹char› и std: :basic_string‹wchar_t›.

Основываясь на OS X 10.6.8, я получаю следующие результаты:

% otool -L /usr/local/boost-1.46.1/lib/libboost_system.dylib
boost-1.46.1/lib/libboost_system.dylib:
    libboost_system.dylib (compatibility version 0.0.0, current version 0.0.0)
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 125.2.11)
    /usr/local/lib/libgcc_s.1.dylib (compatibility version 1.0.0, current version 1.0.0)

Судя по выходным данным 'otool -L', становится ясно, что libstdc++ не связана динамически с библиотекой. Для сравнения, в Ubuntu 12.04 LTS libboost_system.so 1.46.1 показывает следующую ссылку:

% ldd /usr/local/lib/libboost_system.so
    linux-vdso.so.1 =>  (0x00007fff495ff000)
    librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007fec4edb4000)
    libstdc++.so.6 => /usr/local/lib64/libstdc++.so.6 (0x00007fec4ea82000)
    libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fec4e788000)
    libgcc_s.so.1 => /usr/local/lib64/libgcc_s.so.1 (0x00007fec4e573000)
    libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007fec4e355000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fec4df98000)
    /lib64/ld-linux-x86-64.so.2 (0x00007fec4f1e4000)

В этом случае libstdc++ явно был динамически связан. Что касается OS X, вот как я узнаю, что код STL был включен непосредственно в библиотеку Boost:

% nm -gfj /usr/local/boost-1.46.1/lib/libboost_system.dylib | c++filt --format=gnu-v3 | egrep "^std::basic_string"
std::basic_string<char, std::char_traits<char>, std::allocator<char> >::_M_disjunct(char const*) const
std::basic_string<char, std::char_traits<char>, std::allocator<char> >::find_last_of(char const*, unsigned long) const
std::basic_string<char, std::char_traits<char>, std::allocator<char> >::find_last_of(char const*, unsigned long, unsigned long) const
std::basic_string<char, std::char_traits<char>, std::allocator<char> >::find_last_of(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned long) const
std::basic_string<char, std::char_traits<char>, std::allocator<char> >::find_last_of(char, unsigned long) const
... [180 more lines] ...

person Neil Steiner    schedule 22.06.2012    source источник


Ответы (1)


Вот один пример: std::basic_string<char, std::char_traits<char>, std::allocator<char> >::find_last_of(char const*, unsigned long) const

std::basic_string — это класс-шаблон, которого нет в libstdc++.dylib. Он был создан, когда была скомпилирована библиотека boost, и (правильно) включена туда, потому что Boost.System использует ее.

Я подозреваю (но не знаю), что это верно для всех вызовов, которые вы видите.

person Marshall Clow    schedule 22.06.2012
comment
Это кажется довольно очевидным, когда вы так формулируете это, не так ли? Я подтвердил ваши подозрения и убедился, что они верны. Спасибо за ответ. - person Neil Steiner; 25.06.2012