Как установить последнюю версию glibc (версия 2.29) рядом с установленной системой и скомпилировать программу? - PullRequest
0 голосов
/ 12 февраля 2019

На основе этой ссылки Stackoverflow Я скачал и установил glibc v2.29 в пути "/ usr / local / glibc" ОС Linux.Затем на основе этой Stackoverflow ссылки я попытался скомпилировать этот пример , но я получил следующие ошибки. Команда первой попытки:

gcc -Wall -g -o main main.c -Wl, - rpath = / usr / local / glibc / lib -Wl, -динамико-линкер = / USR / местные / Glibc / Библиотека / LD-Linux-x86-64.so.2

Журнал ошибок первой попытки:

main.c:1:10: fatal error: threads.h: No such file or directory
#include <threads.h>
         ^~~~~~~~~~~
compilation terminated.

Команда второй попытки: Во второй попытке я использую "-I " & " - L " Параметры команды GCC.

gcc -Wall -g -I / usr / local / glibc / include -o main main.c -L / usr / local / glibc / lib -Wl, - rpath = / usr / local / glibc / lib -Wl, - динамический компоновщик = / usr / local / glibc / lib / ld-linux-x86-64.so.2

Журнал ошибок второй попытки:

/tmp/ccCNYemW.o: In function `main':
/home/.../main.c:14: undefined reference to `thrd_create'
/home/.../main.c:16: undefined reference to `thrd_join'
collect2: error: ld returned 1 exit status

Так что я не знаю, в чем проблема.Пожалуйста, помогите мне.

Ответы [ 2 ]

0 голосов
/ 16 февраля 2019

Команда второй попытки: во второй попытке я использую опции команды "-I" и "-L" GCC.

gcc -Wall -g -I/usr/local/glibc/include -o main main.c -L/usr/local/glibc/lib -Wl,--rpath=/usr/local/glibc/lib -Wl,--dynamic-linker=/usr/local/glibc/lib/ld-linux-x86-64.so.2

Эта команда почти правильно.Функции thrd_create и thrd_join определены в libpthread, с которым вы не не связали ссылку.

Добавьте -pthread к вашей команде компиляции, и ссылка должна быть успешной.

PS Совет не устанавливать альтернативный GLIBC в /usr/local также является хорошим.

0 голосов
/ 12 февраля 2019

Прежде всего, не помещайте альтернативный libc (или альтернативную версию вашего libc) в путь, который ищется обычным включением и поиском по библиотеке (как по поиску по ссылкам, так и по времени выполнения) для вашей основной системы.Это рецепт катастрофы.Установка другого glibc в /usr/local/ не позволяет избежать путаницы в вашей системе, но теперь у вас есть только два установленных в местах, где их могут видеть и использовать одни и те же инструменты.

Чтобы сделать это правильно, вам действительно нужен полныйотдельный набор инструментов (gcc, binutils) по какому-то совершенно отдельному пути (например, ~/my_glibc_root/... или /opt/alt_glibc_root/...).Я не уверен, есть ли рекомендуемый способ сделать это.Процедуры сборки glibc в Linux From Scratch могут быть хорошим местом для поиска идей.Теоретически это можно сделать за один этап;Я делаю это с помощью musl libc в musl-cross-make путем осторожного использования промежуточных правил make в системе сборки gcc.Но применение той же идеи к glibc, вероятно, требует особой осторожности.

...