Компиляция GCC-5.0 OS X Lion dyld: Символ не найден: __ZNKSt11logic_error4whatEv

Я пытаюсь установить gcc-5.0 из исходного кода на свой OS X 10.7.5, используя (построенный Apple) /usr/bin/gcc-4.2 и соответствующие версии зависимостей gcc (gmp,mpfr,mpc), которые установлены в /usr/local.

Причина, по которой я пытаюсь (повторно) установить gcc-5.0, заключается в том, что я хочу установить его в отдельную папку, например /usr/local/gcc-5.0, чтобы я мог легко выбрать, использовать его или нет, установив его в переменную среды PATH. Скрипт /configure (запускается из пустой папки gcc-5.0-build)

../gcc-5.0.0/configure --prefix=/usr/local/gcc-5.0.0 --with-gmp=/usr/local/lib --with-mpfr=/usr/local/lib --with-mpc=/usr/local/lib --enable-languages=c,c++

После make и около 1 ГБ скомпилированных файлов я получаю эту ошибку (усеченную)

dyld: Symbol not found: __ZNKSt11logic_error4whatEv
  Referenced from: <my-build-dir>/x86_64-apple-darwin11.4.0/libstdc++-v3/src/.libs/libstdc++.6.dylib
  Expected in: flat namespace

После просмотра множества веб-страниц и сообщений в Stackoverflow я пробовал разные вещи, например:

добавление LDFLAGS="-flat_namespace"перед ./configure

компиляция с Apple построила gcc-4.2 вместо gcc-5.0

но не повезло, я все еще получаю эту ошибку.

Когда я проверяю libstdc++.6.dylib на наличие __ZNKSt11logic_error4whatEv

nm -g x86_64-apple-darwin11.4.0/libstdc++-v3/src/.libs/libstdc++.6.dylib | grep  __ZNKSt11logic_error4whatEv

Он возвращает:

U __ZNKSt11logic_error4whatEv

поэтому он содержит рассматриваемый символ он не содержит рассматриваемый символ (U означает неопределенный)

otool -hv x86_64-apple-darwin11.4.0/libstdc++-v3/src/.libs/libstdc++.6.dylib

возвращается

Mach header
      magic cputype cpusubtype  caps    filetype ncmds sizeofcmds      flags
MH_MAGIC_64  X86_64        ALL  0x00       DYLIB    13       2560   NOUNDEFS DYLDLINK TWOLEVEL WEAK_DEFINES BINDS_TO_WEAK NO_REEXPORTED_DYLIBS

DYLDLINK TWOLEVEL означает, что это двухуровневая библиотека пространства имен.

Вопросы :

1- В сообщении Expected in: flat namespace означает ли это, что компилятору нужна абсолютно только библиотека плоского пространства имен? Я имею в виду, что абсолютно невозможно использовать эту библиотеку с двухуровневым пространством имен? После комментария @G.M. символ не определен в рассматриваемой библиотеке, и это делает отсутствие или присутствие flat namespace неуместным, поскольку проблема возникает из-за содержимого библиотеки, а не ее типа.

2- Что мне делать, чтобы скомпилировать gcc-5.0?

Обновление 23 марта 2021 г.

На ответ, предлагающий скрыть символы, я добавил

export CFLAGS="-fvisibility=hidden"

на ~/.bash_profile полностью удалил папку сборки, снова настроил с помощью

../gcc-5.0.0-20150224/configure --prefix=/usr/local/gcc-5.0.0 --enable-languages=c,c++

и после того, как make создал 532 МБ скомпилированных файлов, он остановился из-за strip: имена символов, перечисленных в:libgcc-darwin.10.4.ver не в libgcc_s.dylib типа ошибки. Вот как это остановилось:

/Users/thompson/Downloads/gcc-5.0.0-20150224-mybuild/./gcc/xgcc -B/Users/thompson/Downloads/gcc-5.0.0-20150224-mybuild/./gcc/ -B/usr/local/gcc-5.0.0/x86_64-apple-darwin11.4.2/bin/ -B/usr/local/gcc-5.0.0/x86_64-apple-darwin11.4.2/lib/ -isystem /usr/local/gcc-5.0.0/x86_64-apple-darwin11.4.2/include -isystem /usr/local/gcc-5.0.0/x86_64-apple-darwin11.4.2/sys-include    -O2  -g -O2 -fvisibility=hidden -DIN_GCC    -W -Wall -Wwrite-strings -Wcast-qual -Wno-format -Wstrict-prototypes -Wmissing-prototypes -Wold-style-definition  -isystem ./include   -pipe -fno-common -g -DIN_LIBGCC2 -fbuilding-libgcc -fno-stack-protector  -dynamiclib -nodefaultlibs -install_name /usr/local/gcc-5.0.0/lib/libgcc_s.1.dylib -single_module -o ./libgcc_s.dylib -Wl,-exported_symbols_list,libgcc.map -compatibility_version 1 -current_version 1.0 -g -O2 -fvisibility=hidden -B./ _muldi3_s.o _negdi2_s.o _lshrdi3_s.o _ashldi3_s.o _ashrdi3_s.o _cmpdi2_s.o _ucmpdi2_s.o _clear_cache_s.o _trampoline_s.o __main_s.o _absvsi2_s.o _absvdi2_s.o _addvsi3_s.o _addvdi3_s.o _subvsi3_s.o _subvdi3_s.o _mulvsi3_s.o _mulvdi3_s.o _negvsi2_s.o _negvdi2_s.o _ctors_s.o _ffssi2_s.o _ffsdi2_s.o _clz_s.o _clzsi2_s.o _clzdi2_s.o _ctzsi2_s.o _ctzdi2_s.o _popcount_tab_s.o _popcountsi2_s.o _popcountdi2_s.o _paritysi2_s.o _paritydi2_s.o _powisf2_s.o _powidf2_s.o _powixf2_s.o _powitf2_s.o _mulsc3_s.o _muldc3_s.o _mulxc3_s.o _multc3_s.o _divsc3_s.o _divdc3_s.o _divxc3_s.o _divtc3_s.o _bswapsi2_s.o _bswapdi2_s.o _clrsbsi2_s.o _clrsbdi2_s.o _fixunssfsi_s.o _fixunsdfsi_s.o _fixunsxfsi_s.o _fixsfdi_s.o _fixdfdi_s.o _fixxfdi_s.o _fixunssfdi_s.o _fixunsdfdi_s.o _fixunsxfdi_s.o _floatdisf_s.o _floatdidf_s.o _floatdixf_s.o _floatundisf_s.o _floatundidf_s.o _floatundixf_s.o _fixsfti_s.o _fixdfti_s.o _fixxfti_s.o _fixtfti_s.o _fixunssfti_s.o _fixunsdfti_s.o _fixunsxfti_s.o _fixunstfti_s.o _floattisf_s.o _floattidf_s.o _floattixf_s.o _floattitf_s.o _floatuntisf_s.o _floatuntidf_s.o _floatuntixf_s.o _floatuntitf_s.o _divdi3_s.o _moddi3_s.o _udivdi3_s.o _umoddi3_s.o _udiv_w_sdiv_s.o _udivmoddi4_s.o darwin-64_s.o cpuinfo_s.o sfp-exceptions_s.o addtf3_s.o divtf3_s.o eqtf2_s.o getf2_s.o letf2_s.o multf3_s.o negtf2_s.o subtf3_s.o unordtf2_s.o fixtfsi_s.o fixunstfsi_s.o floatsitf_s.o floatunsitf_s.o fixtfdi_s.o fixunstfdi_s.o floatditf_s.o floatunditf_s.o fixtfti_s.o fixunstfti_s.o floattitf_s.o floatuntitf_s.o extendsftf2_s.o extenddftf2_s.o extendxftf2_s.o trunctfsf2_s.o trunctfdf2_s.o trunctfxf2_s.o enable-execute-stack_s.o unwind-dw2_s.o unwind-dw2-fde-darwin_s.o unwind-sjlj_s.o unwind-c_s.o emutls_s.o libgcc.a -lc

ld: warning: cannot export hidden symbol ___ashldi3 from darwin-64_s.o
ld: warning: cannot export hidden symbol ___ashrdi3 from darwin-64_s.o
ld: warning: cannot export hidden symbol ___clzsi2 from darwin-64_s.o
ld: warning: cannot export hidden symbol ___cmpdi2 from darwin-64_s.o
<truncated>
ld: warning: cannot export hidden symbol ___fixunstfsi from fixunstfsi_s.o
ld: warning: cannot export hidden symbol ___floatsitf from floatsitf_s.o
<truncated>
ld: warning: cannot export hidden symbol ___enable_execute_stack from enable-execute-stack_s.o
<truncated>
ld: warning: cannot export hidden symbol ___emutls_register_common from emutls_s.o

MLIBS=`/Users/thompson/Downloads/gcc-5.0.0-20150224-mybuild/./gcc/xgcc -B/Users/thompson/Downloads/gcc-5.0.0-20150224-mybuild/./gcc/ -B/usr/local/gcc-5.0.0/x86_64-apple-darwin11.4.2/bin/ -B/usr/local/gcc-5.0.0/x86_64-apple-darwin11.4.2/lib/ -isystem /usr/local/gcc-5.0.0/x86_64-apple-darwin11.4.2/include -isystem /usr/local/gcc-5.0.0/x86_64-apple-darwin11.4.2/sys-include    --print-multi-lib | sed -e 's/;.*$//'` ; \
    for mlib in $MLIBS ; do \
      cp ../${mlib}/libgcc/${mlib}/libgcc_s.dylib  \
        ./libgcc_s.1.dylib_T_${mlib} || exit 1 ; \
    done

lipo -output libgcc_s.1.dylib \
      -create libgcc_s.1.dylib_T*
rm libgcc_s.1.dylib_T*

<truncated>

strip: symbols names listed in: <source-folder>/libgcc/config/i386/libgcc-darwin.10.4.ver not in: </Users/thompson/Downloads/gcc-5.0.0-20150224-mybuild>/x86_64-apple-darwin11.4.2/libgcc/libgcc_s.dylib
___ashldi3
___ashrdi3
___clzsi2
___cmpdi2
___ctzsi2
___divdi3
___enable_execute_stack
___gcc_personality_v0
___lshrdi3
___moddi3
___muldi3
___negdi2
___paritysi2
___popcountsi2
___ucmpdi2
___udivdi3
___udivmoddi4
___umoddi3
make[3]: *** [libgcc_ext.10.4.dylib] Error 1
make[2]: *** [all-stage1-target-libgcc] Error 2

person Terry    schedule 13.10.2019    source источник
comment
Я бы порекомендовал либо придерживаться версии, поставляемой Apple (которая очень старая), использовать доморощенный вариант, чтобы получить более новую версию, либо просто использовать поддерживаемый компилятор на macos, который является clang.   -  person Alan Birtles    schedule 13.10.2019
comment
Версия, предоставленная Apple, gcc-4.2 присутствует в моей системе, и не имеет значения, использую ли я ее или (поставляемую GNU) версию gcc-5.0 для компиляции gcc-5.0, они обе дают одну и ту же ошибку expected in: flat namespace.   -  person Terry    schedule 13.10.2019
comment
Я хочу сказать, что компиляция GCC — долгая, иногда сложная и скучная задача, не утруждайте себя попытками и используйте доморощенный или лязг внутри.   -  person Alan Birtles    schedule 13.10.2019
comment
3 года назад мне удалось скомпилировать gcc-5.0 из исходников на этом же Mac. На самом деле, он компилирует все файлы без каких-либо проблем: более 1 ГБ скомпилированных файлов находятся в папке сборки. Ошибки symbol not found обычно исправляются путем устранения возможных несоответствий библиотек, добавления некоторых флагов компоновщика и т. д. Я отказался от использования Homebrew много лет назад, так как у него действительно есть свои проблемы. Но я буду искать возможности решения с Clang.   -  person Terry    schedule 13.10.2019
comment
Я не уверен, но... вывод, который вы видите из nm, начинается с U. Обычно это означает undefined. Это означает, что ваш libstdc++ ссылается на символ, но не содержит его определение.   -  person G.M.    schedule 13.10.2019
comment
Вы правы. Оказывается, U действительно означает, что символ не определен. В этом случае очень вероятно, что ошибка не была вызвана отсутствием flat namespace, т.е. это просто отвлечение внимания. Итак, настоящая проблема в том, что библиотека содержит символ, но не его определение. Это, кажется, отвечает на мой 1-й вопрос. Я отредактирую пост.   -  person Terry    schedule 13.10.2019


Ответы (1)


Я столкнулся с той же ошибкой при запуске моего приложения в режиме выпуска. После двух дней поисков мне удалось решить эту проблему, отключив Символы, скрытые по умолчанию в настройках сборки проекта динамической библиотеки. Надеюсь, это будет полезно для вас и других с той же ошибкой.

person Vichal    schedule 22.07.2020
comment
Спасибо за ответ. Этот ответ, должно быть, ускользнул от моего внимания, потому что он пришелся на время, когда пандемия достигла своего пика во всем мире. Теперь я применил его, добавив export CFLAGS="-fvisibility=hidden" в ~/.bash_profile, и сборка остановилась на более ранней стадии (когда скомпилированные файлы были 527 МБ по сравнению с примерно 1 ГБ), и это дало полосу: имена символов, перечисленные в: libgcc-darwin.10.4.ver не в libgcc_s.dylib тип ошибки . Поскольку ошибка слишком длинная, чтобы поместиться здесь, я добавил ее в основной пост. Смотрите пост отредактированный. - person Terry; 23.03.2021