фон – это то, о чем говорилось в предыдущей статье,Если вы развернете центр документов gitbook,Сначала вам нужно установить узел,Затем,Если версия вашего узла слишком высока,Обычно сообщается об ошибке,в это время,Многие статьи в Интернете решают проблему путем понижения версии узла.,Но на самом деле есть способ использовать более высокую версию,Просто немного хлопотно,Код необходимо изменить, но;,Когда я загрузил более новую версию узла и установил ее,Обнаружил, что существующий centos7 все еще не может быть установлен.,Можно сказать, что одна волна следует за другой.
Версия nodejs, сообщившая об ошибке: v18, конкретная здесь — node-v18.18.2-linux-x64.tar.xz.
Версия сервера — centos 7.6, centos 7.9 (пробовал обе)
Вы можете рассмотреть следующий вопрос:
https://stackoverflow.com/questions/72571235/can-i-install-node-js-18-on-centos-7-and-do-i-need-python-3-install-too#:~:text=Starting%20v18%2C%20Node.,due%20to%20glibc%20version%20incompatibility.
image-20231024213204595
https://github.com/nodejs/node/issues/43246
Все еще было довольно шумно. Что, на мой взгляд, также немного сбивает с толку, так это то, что при загрузке в документе нет подсказки, например, доступен ли он на centos7. После того, как он был загружен и возникло множество проблем, я обнаружил, что версия несовместима. Я искал в Интернете.
Подробнее об этом вопросе поговорим ниже.
tar -xvf node-v18.18.2-linux-x64.tar.xz
cd node-v18.18.2-linux-x64/
[root@VM-0-6-centos node-v18.18.2-linux-x64]# bin/node
bin/node: /lib64/libm.so.6: version `GLIBC_2.27' not found (required by bin/node)
bin/node: /lib64/libc.so.6: version `GLIBC_2.25' not found (required by bin/node)
bin/node: /lib64/libc.so.6: version `GLIBC_2.28' not found (required by bin/node)
bin/node: /lib64/libstdc++.so.6: version `CXXABI_1.3.9' not found (required by bin/node)
bin/node: /lib64/libstdc++.so.6: version `GLIBCXX_3.4.20' not found (required by bin/node)
bin/node: /lib64/libstdc++.so.6: version `GLIBCXX_3.4.21' not found (required by bin/node)
Вот что означает эта ошибка.Когда узел выполняется, это зависит от некоторых динамических библиотек, от которых это зависит:
[root@VM-0-6-centos node-v18.18.2-linux-x64]# ldd bin/node
linux-vdso.so.1 => (0x00007fff34927000)
libdl.so.2 => /lib64/libdl.so.2 (0x00007fd57af20000)
libstdc++.so.6 => /lib64/libstdc++.so.6 (0x00007fd57ac19000)
libm.so.6 => /lib64/libm.so.6 (0x00007fd57a917000)
libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00007fd57a701000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00007fd57a4e5000)
libc.so.6 => /lib64/libc.so.6 (0x00007fd57a117000)
/lib64/ld-linux-x86-64.so.2 (0x00007fd57b124000)
существовать => Левая часть этого символа,Это имя зависимой динамической библиотеки.,правая сторона,Просто исходя из этого имени,Поиск по пути, указанному в переменной среды существования LD_LIBRARY_PATH.,Полный путь к динамической библиотеке наконец-то разрешен.
Затем давайте посмотрим на первую строку ошибки:
[root@VM-0-6-centos node-v18.18.2-linux-x64]# bin/node
bin/node: /lib64/libm.so.6: version `GLIBC_2.27' not found (required by bin/node)
/lib64/libm.so.6
Это полный путь,Похоже нашел,Но все равно сообщил об ошибке,Кажется, я хочусуществоватьGLIBC_2.27
Эта версия не найдена。
мы можем сделать это,существоватьосуществлятьldd
Ведите подробный журнал:
[root@VM-0-6-centos]# ldd -v bin/node
Version information:
bin/node:
...
libm.so.6 (GLIBC_2.27) => not found
libm.so.6 (GLIBC_2.2.5) => /lib64/libm.so.6
Такое впечатление, что ищет libm.so.6 (GLIBC_2.27) но не нашел, а нашел libm.so.6 (GLIBC_2.2.5).
На самом деле это так. То, что ядро предоставляет пользователям, — это системный вызов (system). call),но,существовать, когда мы пишем код языка C,Обычно эти системные вызовы не вызываются напрямую.,Вместо этого будут включены некоторые заголовочные файлы.,нравитьсяinclude <stdio.h>
,Эти заголовочные файлы являются интерфейсами,Эти интерфейсы включают в себя их реализацию,Наконец, компилировать стал двойным и стал библиотекой.,Для использования пользователями. Самая ранняя — стандартная библиотека libc.,Позже его постепенно заменили на glibc.,glibc — библиотека libc, выпущенная GNU.,Официальный сайт: https://www.gnu.org/software/libc/libc.html.
Эта библиотека glibc,Например, на моем centos7.6,Где находится существование?
Сначала я проверил, что локальная версия glibc — 2.17:
https://lindevs.com/check-glibc-version-in-linux
Метод 1:
[root@VM-0-6-centos lib64]# ldd --version
ldd (GNU libc) 2.17
Метод 2:
[root@VM-0-6-centos lib64]# ldd `which cat` | grep libc
libc.so.6 => /lib64/libc.so.6 (0x00007f27331c8000)
[root@VM-0-6-centos lib64]# /lib64/libc.so.6
GNU C Library (GNU libc) stable release version 2.17, by Roland McGrath et al.
В Glibc обычно есть пакеты rpm. Я нашел версию 2.17 пакета glibc x86-64 на этом сайте:
https://rpmfind.net/linux/RPM/centos/updates/7.9.2009/x86_64/Packages/glibc-2.17-326.el7_9.x86_64.html
Как видите, на самом деле он содержит множество файлов, включая /lib64/libm.so.6:
image-20231025220044115
Итак, что я на самом деле имею в виду,/lib64/libm.so.6
то естьglibcчасть,Тогда эта версия glibc 2.17,включено/lib64/libm.so.6
Что означает эта ошибка??
[root@VM-0-6-centos]# ldd -v bin/node
Version information:
bin/node:
...
libm.so.6 (GLIBC_2.27) => not found
libm.so.6 (GLIBC_2.2.5) => /lib64/libm.so.6
Я нашел отличный ответ:
https://unix.stackexchange.com/questions/458659/what-do-the-multiple-glibc-versions-mean-in-the-output-of-ldd
“GLIBC_..., GLIBCXX_... etc. are version symbols, which are used in some libraries (including the GNU C library and the GCC libraries) to identify required versions and to manage backward compatibility. A binary (executable or library) will usually end up requiring multiple versions, based on the symbols it really uses from the target library. To satisfy the requirements of a given binary, you need to provide a library which supports all the required versions — i.e. a library matching at least the highest version symbol in the list of requirements. ”
Переведено,GLIBC_...
ждатьGLIBCXX_...
это символ версии,существоватьнекоторые библиотеки(включатьGNU библиотека C и библиотека GCC) для определения необходимых версий и управления обратной совместимостью. Двоичному файлу (исполняемому файлу или библиотеке) часто требуется несколько версий, в зависимости от того, какие символы из целевой библиотеки он фактически использует. Чтобы удовлетворить требования данного двоичного файла, вам необходимо предоставить библиотеку, поддерживающую все необходимые версии. -Прямо сейчасБиблиотека, соответствующая как минимум самому старшему символу версии в списке требований.。
“The reason multiple versions can end up being required, is that each imported object (function etc.) can have a version, and a given binary can link against multiple versions across all the functions it uses. ”
Перевод: Причина, по которой вам может понадобиться несколько версий, заключается в том, что каждый импортированный объект (функция и т. д.) может иметь версию, а данный двоичный файл может быть связан с несколькими версиями всех используемых им функций.
Я взял здесь только часть.,Вам следует прочитать оригинальный текст,Во всяком случае, вот что это значит,Например, программный узел,этото естьбудет использоваться/lib64/libm.so.6
Разные внутриversion symbol
изфункция,что тебе нужно сделать,Просто удовлетвори это,в противном случае,Сообщает об ошибке.
Как его удовлетворить?,то есть Пучок/lib64/libm.so.6
из Обновление версии,пока не содержитGLIBC_2.27
этотversion symbol。
Как я могу получить повышение?/lib64/libm.so.6
Поднимаемся,Тогда, поскольку это часть glibc,Естественно, вы можете обновить glibc только целиком до указанной версии.,СравниватьнравитьсяздесьизGLIBC_2.27
。
Ссылка на статью здесь:
https://mp.weixin.qq.com/s/Xhm_BmMH2EoVWMPRWfCnaw
Встретимсяиз Почти ловушка。в статье1. Установите компилированную среду devtoolset-8.
В этой части не должно быть ничего особенного.сосредоточиться на,Я не думаю, что нужно что-то делать.,Из-за этого ленивого способа установки gcc,Это не может решить проблему ошибок установки узла.,Просто посмотрите ниже, чтобы узнать.
Начать обновление glibc,Стоит отметить, что,Это лучше для всехвиртуальная машина, личный облачный хост, чтобы играть в первую очередь, не используйте для этого среду, используемую другими людьми, машину легко полностью повредить до бесконечности, также не забудьте сделать резервную копию перед игрой, например, сначала скопировать; виртуальная машинауйди
Если он работает медленно, вы можете вручную загрузить и загрузить его самостоятельно.
wget https://ftp.gnu.org/gnu/glibc/glibc-2.28.tar.gz --no-check-certificate
tar -xzvf glibc-2.28.tar.gz
cd glibc-2.28
mkdir build && cd build (Обязательно создайте отдельную папку для сборки)
существоватькомпилировать Прежде чем начать,Исправлять scripts/test-installation.pl Добавлена строка 128. && $name ne "nss_test2" чтобы избежать ошибок компиляции nss_test2 сообщает об ошибке. В любом случае, просто добавьте строку.
Следующий,Это команда настройки,Обратите особое внимание на добавление --enable-obsolete-nsl.,решатьundefined reference to '_nsl_default_nss@GLIBC_PRIVATE'
, в его статье можно использовать и другие варианты, но у меня команда потерялась (виртуальная машина позже была повреждена другими вещами)
../configure --prefix=/usr --disable-profile --enable-add-ons --with-headers=/usr/include --with-binutils=/usr/bin --enable-obsolete-nsl
Тогда есть:
make или make -j4 (4 потока выполняются одновременно)
Помню, у меня это заняло где-то полчаса-час, я забыл, это была еще виртуальная. Машина Такая плохая производительность
make install
Проверьте версию внутри symbol:
strings /lib64/libc.so.6 | grep GLIBC
После решения вышеуказанной проблемы я продолжаю выполнять узел, но сообщение об ошибке по-прежнему выдается следующим образом:
bin/node: /lib64/libstdc++.so.6: version `CXXABI_1.3.9' not found (required by bin/node)
bin/node: /lib64/libstdc++.so.6: version `GLIBCXX_3.4.20' not found (required by bin/node)
bin/node: /lib64/libstdc++.so.6: version `GLIBCXX_3.4.21' not found (required by bin/node)
Посмотрите на символы внутри этого версия, последняя — 1.3.7, которая не соответствует требованиям 1.3.9:
[root@VM-0-6-centos node-v18.18.2-linux-x64]# strings /lib64/libstdc++.so.6 |grep CXXABI_
CXXABI_1.3
CXXABI_1.3.1
CXXABI_1.3.2
CXXABI_1.3.3
CXXABI_1.3.4
CXXABI_1.3.5
CXXABI_1.3.6
CXXABI_1.3.7
Последней является 3.4.19, которая не соответствует требованиям 3.4.20 и 3.4.21:
[root@VM-0-6-centos node-v18.18.2-linux-x64]# strings /lib64/libstdc++.so.6 |grep GLIBCXX
...
GLIBCXX_3.4.11
GLIBCXX_3.4.12
GLIBCXX_3.4.13
GLIBCXX_3.4.14
GLIBCXX_3.4.15
GLIBCXX_3.4.16
GLIBCXX_3.4.17
GLIBCXX_3.4.18
GLIBCXX_3.4.19
Согласно официальной документации:
https://gcc.gnu.org/wiki/InstallingGCC
Перед установкой gcc вам необходимо сначала установить зависимую версию gmp-devel mpfr-devel libmpc-devel. Во многих статьях говорится об установке yum. Я думаю, что это нормально, но боюсь, что версия gcc не соответствует зависимым версиям, установленным. ням. Я предлагаю Или установить его следующим образом:
wget https://ftp.gnu.org/gnu/gcc/gcc-8.5.0/gcc-8.5.0.tar.gz --no-check-certificate
cd gcc-8.5.0
./contrib/download_prerequisites
На этом этапе будет загружен соответствующий исходный код, для которого требуется Интернет:
[root@VM-0-6-centos gcc-8.5.0]# ./contrib/download_prerequisites
2023-10-22 15:40:49 URL: ftp://gcc.gnu.org/pub/gcc/infrastructure/gmp-6.1.0.tar.bz2 [2383840] -> "./gmp-6.1.0.tar.bz2" [1]
2023-10-22 15:42:05 URL: ftp://gcc.gnu.org/pub/gcc/infrastructure/mpfr-3.1.4.tar.bz2 [1279284] -> "./mpfr-3.1.4.tar.bz2" [1]
2023-10-22 15:42:42 URL: ftp://gcc.gnu.org/pub/gcc/infrastructure/mpc-1.0.3.tar.gz [669925] -> "./mpc-1.0.3.tar.gz" [1]
2023-10-22 15:44:31 URL: ftp://gcc.gnu.org/pub/gcc/infrastructure/isl-0.18.tar.bz2 [1658291] -> "./isl-0.18.tar.bz2" [1]
gmp-6.1.0.tar.bz2: OK
mpfr-3.1.4.tar.bz2: OK
mpc-1.0.3.tar.gz: OK
isl-0.18.tar.bz2: OK
All prerequisites downloaded successfully.
После загрузки несколько пакетов tar сохраняются в текущем каталоге.
mkdir build
cd build/
Мне не нужен gcc для поддержки компилированияgo. При необходимости вы можете добавить его.
../configure --disable-multilib --enable-languages=c,c++ --prefix=$HOME/local
Следующий шаг — make. Сначала я пытался сделать это быстрее, но у меня получилось:
nohup make -j4 2>&1 &
В результате после долгого ожидания выдали сообщение об ошибке. . . С намерением попробовать, я изменил его, чтобы сделать, и это сработало.
nohup make 2>&1 &
tailf nohup.out
make install
export LD_LIBRARY_PATH=$HOME/local/lib64
Выполнение этого make здесь занимает много времени. В любом случае, мой облачный хост такой: 1 ядро, 2g, процессор всегда на 100%, и он работал 2 с половиной часа:
image-20231025225356657
С 4:20:
image-20231025225415970
Сейчас 6:40:
image-20231025225433610
После этого вы сможете снова использовать узел, и проблем быть не должно. Эй, вы сказали, что документы вашего официального веб-сайта не могут напомнить мне, какая последняя версия поддерживает Centos7. На полпути сообщается об ошибке, а затем одна версия понижается одна за другой, пока в интернет-сообществе не будет сообщено об ошибках. также полно жалоб, я убежден.