Как мне установить libstdc++, который я только что собрал как часть gcc?

Несколько месяцев назад я собрал и установил gcc 4.8.2 в своей системе. Сегодня я использовал его для компиляции программы, использующей библиотеку потоков C++11, и когда я запустил ее, она пожаловалась, что не удалось найти нужную версию libstdc++. Поэтому я вернулся в исходное дерево gcc 4.8.2 и вручную скопировал libstdc++-6.0.18 в соответствующее место. После этого программа заработала корректно.

Меня озадачивает, что он не был установлен автоматически, когда я устанавливал gcc. Есть ли способ установить его без копирования файла вручную?

Изменить в ответ на комментарии: Сообщение об ошибке:

./a.out: /usr/lib/x86_64-linux-gnu/libstdc++.so.6: version `GLIBCXX_3.4.19' not found (required by ./a.out)

Выход g++ -v:

Using built-in specs.
COLLECT_GCC=g++
COLLECT_LTO_WRAPPER=/usr/local/libexec/gcc/x86_64-unknown-linux-gnu/4.8.2/lto-wrapper
Target: x86_64-unknown-linux-gnu
Configured with: ./configure --program-suffix=-4.8.2
Thread model: posix
gcc version 4.8.2 (GCC) 

person Brian Bi    schedule 04.05.2014    source источник
comment
Покажи свое сообщение об ошибке. Я предполагаю, что это было от ld.so. Также покажите вывод g++ -v.   -  person kec    schedule 04.05.2014
comment
@user3521733 user3521733 Просто чтобы уточнить, копирование библиотеки вручную сработало, но мне интересно, было ли это тем, что я должен был делать.   -  person Brian Bi    schedule 04.05.2014
comment
Извините, я имею в виду не только -v отдельно, но и -v во время компиляции. В любом случае, проблема в вашем пути запуска. Однако я буду использовать ответ, а не комментарий, чтобы упростить форматирование.   -  person kec    schedule 04.05.2014
comment
Это часто задаваемые вопросы: gcc.gnu.org/onlinedocs/libstdc++/faq .html#faq.how_to_set_paths   -  person Jonathan Wakely    schedule 06.05.2014


Ответы (2)


Проблема, похоже, в runpath/rpath. По сути, во время связывания используются два пути, поскольку связывание происходит в два этапа (обычно). Первый этап — это сборка исполняемого файла, и это скорее «предварительная ссылка». Путь к библиотеке обычно задается при установке gcc, и вы можете увидеть это с помощью -v в качестве опции -L для компоновщика (обычно collect2). Во время выполнения фактическая ссылка выполняется. Путь для этого задается по-другому и не задается при установке.

Вероятно, лучший способ установить это с помощью ldconfig, см. здесь. Вы можете установить переменную окружения LD_RUN_PATH при компиляции. Чтобы увидеть, какие библиотеки будут использоваться во время выполнения, используйте команду ldd.

ДОБАВЛЕНИЕ: Лично я устанавливаю все, что не управляется менеджером пакетов, в отдельный каталог. Затем я использую что-то вроде stow для создания симлинков из /usr/local/bin и т. д. В противном случае вещи разбросаны повсюду в /usr/local и просто создают беспорядок.

person kec    schedule 04.05.2014
comment
Я понимаю, как сказать ld.so, где искать. Мой вопрос заключается в том, должна ли установка gcc (т.е., запуск make install в дереве исходного кода) копировать только что созданный libstdc++ в мою систему. Потому что я не думаю, что это произошло. - person Brian Bi; 04.05.2014
comment
Ну, так оно и было, в буквальном смысле. Место установки выглядит как /usr/local. Вы сможете окончательно увидеть, куда он установлен, скомпилировав с -v. Вам нужно ld.so, чтобы посмотреть там. Обратите внимание, что вы можете управлять местом установки с помощью параметра --prefix для настройки. - person kec; 04.05.2014

Сегодня я использовал его для компиляции программы, использующей библиотеку потоков C++11, и когда я запустил ее, она пожаловалась, что не удалось найти нужную версию libstdc++.

См. http://gcc.gnu.org/onlinedocs/libstdc++/faq.html#faq.how_to_set_paths и раздел руководства, на который он ссылается.

Поэтому я вернулся в исходное дерево gcc 4.8.2 и вручную скопировал libstdc++-6.0.18 в соответствующее место. После этого программа заработала корректно.

Я предполагаю, что под «подходящим местом» вы имеете в виду где-то под /usr/lib. Нет, это определенно не то, что ты должен делать. Это вызовет проблему, если вы обновите свою систему позже, и менеджер пакетов дистрибутива попытается установить GCC 4.8.2, потому что он будет конфликтовать с файлом, который вы поместили туда вручную.

Меня озадачивает, что он не был установлен автоматически, когда я устанавливал gcc. Есть ли способ установить его без копирования файла вручную?

Он был установлен в то место, куда вы настроили установку GCC. Поскольку вы не использовали --prefix при настройке GCC, он будет установлен в /usr/local и поместит библиотеку куда-то туда. Вероятно, у вас есть /usr/local/bin в $PATH, поэтому вы можете найти новую g++, но компоновщик времени выполнения не знает, как искать общие библиотеки в /usr/local.

Снова прочитайте http://gcc.gnu.org/onlinedocs/libstdc++/faq.html#faq.how_to_set_paths и руководство, чтобы понять, как сообщить компоновщику, как найти библиотеку.

person Jonathan Wakely    schedule 06.05.2014