Изменить путь к библиотеке g++

Недавно я установил gcc 4.9.2 и обнаружил проблему при связывании с библиотеками.

Вывод для пути поиска:

install: /usr/lib/gcc/x86_64-unknown-linux-gnu/4.9.2/
programs: =/usr/libexec/gcc/x86_64-unknown-linux-gnu/4.9.2/:/usr/libexec/gcc/x86_64-unknown-linux-gnu/4.9.2/:/usr/libexec/gcc/x86_64-unknown-linux-gnu/:/usr/lib/gcc/x86_64-unknown-linux-gnu/4.9.2/:/usr/lib/gcc/x86_64-unknown-linux-gnu/:/usr/lib/gcc/x86_64-unknown-linux-gnu/4.9.2/../../../../x86_64-unknown-linux-gnu/bin/x86_64-unknown-linux-gnu/4.9.2/:/usr/lib/gcc/x86_64-unknown-linux-gnu/4.9.2/../../../../x86_64-unknown-linux-gnu/bin/x86_64-linux-gnu/:/usr/lib/gcc/x86_64-unknown-linux-gnu/4.9.2/../../../../x86_64-unknown-linux-gnu/bin/
libraries: =/usr/lib/gcc/x86_64-unknown-linux-gnu/4.9.2/:/usr/lib/gcc/x86_64-unknown-linux-gnu/4.9.2/../../../../x86_64-unknown-linux-gnu/lib/x86_64-unknown-linux-gnu/4.9.2/:/usr/lib/gcc/x86_64-unknown-linux-gnu/4.9.2/../../../../x86_64-unknown-linux-gnu/lib/x86_64-linux-gnu/:/usr/lib/gcc/x86_64-unknown-linux-gnu/4.9.2/../../../../x86_64-unknown-linux-gnu/lib/../lib64/:/usr/lib/gcc/x86_64-unknown-linux-gnu/4.9.2/../../../x86_64-unknown-linux-gnu/4.9.2/:/usr/lib/gcc/x86_64-unknown-linux-gnu/4.9.2/../../../x86_64-linux-gnu/:/usr/lib/gcc/x86_64-unknown-linux-gnu/4.9.2/../../../../lib64/:/lib/x86_64-unknown-linux-gnu/4.9.2/:/lib/x86_64-linux-gnu/:/lib/../lib64/:/usr/lib/x86_64-unknown-linux-gnu/4.9.2/:/usr/lib/x86_64-linux-gnu/:/usr/lib/../lib64/:/usr/lib/gcc/x86_64-unknown-linux-gnu/4.9.2/../../../../x86_64-unknown-linux-gnu/lib/:/usr/lib/gcc/x86_64-unknown-linux-gnu/4.9.2/../../../:/lib/:/usr/lib/

На самом деле проблема вот в чем:

/usr/lib/x86_64-linux-gnu/:/usr/lib/../lib64/

Мне нужно изменить порядок этих двух библиотек (чтобы lib64 имела более высокий приоритет поиска), потому что в обоих каталогах есть libstdc++.so.6, и мне нужно использовать тот, который находится в папке lib64.

Как это сделать?

Пожалуйста, не делайте:

1, предлагаю изменить LD_LIBRARY_PATH, чтобы явно включить libstdc++.so.6, поскольку я уверен, что в папке x86_64-linux-gnu есть другие вещи, которые являются более старыми версиями в папке lib64 — я обновил g++ из более старой версии.

2, предлагаю явно включить этот lib64/libstdc++.so.6 в параметр g++ -L.

Большое спасибо.

/************************РЕДАКТИРОВАТЬ ДЛЯ ДОПОЛНИТЕЛЬНОЙ ИНФОРМАЦИИ************************ ***/

По запросу ниже, вот более подробная информация о настройке и установке (я скачал исходный код 4.9.2 с gcc.gnu.org, распаковал его и запустил в папке верхнего уровня 4.9.2):

mkdir ../gcc-build                                   &&
cd    ../gcc-build                                   &&

../gcc-4.9.2/configure                               \
    --prefix=/usr                                    \
    --libdir=/usr/lib                                \
    --enable-shared                                  \
    --enable-threads=posix                           \
    --enable-__cxa_atexit                            \
    --disable-multilib                               \
    --with-system-zlib                               \
    --enable-languages=c,c++ &&
make

person h9uest    schedule 22.02.2015    source источник
comment
Как вы установили GCC (вы установили какой-то пакет?)? На каком дистрибутиве линукса? Вы его сами составляли? Как вы .../configure это сделали? Пожалуйста, отредактируйте свой вопрос, чтобы дать более подробную информацию!   -  person Basile Starynkevitch    schedule 23.02.2015
comment
@BasileStarynkevitch Привет, Василий. Я обновил свой вопрос с более подробной информацией. Дистрибутив Linux — Kali.   -  person h9uest    schedule 23.02.2015
comment
Как была настроена ваша система gcc? Попробуйте, например. gcc-4.8 -v ?   -  person Basile Starynkevitch    schedule 23.02.2015
comment
В какой именно системе (например, в каком дистрибутиве и версии Linux) вы это делаете? Может случиться так, что вы сломали свою систему до такой степени, что вам нужно ее переустановить!   -  person Basile Starynkevitch    schedule 23.02.2015
comment
@BasileStarynkevitch Kali linux, последняя версия 1.0.7 (установлена ​​как более ранняя версия, и я обновил ее до последней перед установкой gcc 4.9.2). Там действительно что-то странное с gcc, который я установил. В качестве временного обходного пути я установил путь к библиотеке в LD_LIBRARY_PATH, все работало нормально, пока я не отладил его с помощью gdb. Я пробовал компилировать с -g и в другом эксперименте -ggdb. В обоих случаях в текущем стеке не было найдено символов для каких-либо переменных. Затем я обновил gdb до последней версии 7.9, но лучше не стало. Я уверен, что что-то не так с моей установкой gcc. Но почему?   -  person h9uest    schedule 23.02.2015
comment
Попробуйте хотя бы переустановить систему GCC.   -  person Basile Starynkevitch    schedule 23.02.2015
comment
Да, возможно, мне придется пойти с жестким подходом. Я попробую установить его в изолированный каталог и посмотрю, что произойдет. Опубликую обратно.   -  person h9uest    schedule 23.02.2015
comment
Кстати, Kali Linux действительно должен включать последнюю версию gcc в свой основной список исходных кодов. Я не могу себе представить, что коллекция компиляторов c/c++ не является последней в дистрибутиве, ориентированном на специалистов по безопасности.   -  person h9uest    schedule 23.02.2015
comment
Я не думаю, что дистрибутив Linux, ориентированный на безопасность, должен содержать последнюю версию GCC. Он должен упаковать самый безопасный GCC....   -  person Basile Starynkevitch    schedule 24.02.2015


Ответы (1)


Вы можете создать новый (или изменить существующий) файл GCC specs, документация находится здесь. .

Насколько я знаю, файл specs находится в вашем установочном каталоге, поэтому для вас он будет в
/usr/lib/gcc/x86_64-unknown-linux-gnu/4.9.2/specs (который вы можете создать, если он не существует).

Насколько я знаю, есть некоторые встроенные настройки по умолчанию, но вы можете настроить свою систему так, чтобы она была явной.

Прочтите также о параметрах отладки GCC. Вы можете использовать -dumpspecs для получения встроенной спецификации по умолчанию.

Детали могут сильно зависеть от вашей системы, особенно если вы скомпилировали GCC из исходного кода.

Я недостаточно знаком с specs файлами, чтобы предложить надежное решение для вашей конкретной проблемы. Подробности можно узнать на [email protected].


NB: я склонен полагать, что настройка gcc с --prefix=/usr (а не несистемным префиксом, таким как --prefix=/usr/local/ по умолчанию или какой-то --prefix=/opt/ и т. д.) является ошибкой (или, по крайней мере, использовать также --program-suffix=-4.9). Скорее всего, вы перепутаете gcc с системой gcc; Если вы хотите заменить свою систему gcc (что, вероятно, опасно), вы должны настроить новую gcc с теми же аргументами, что и ваша система gcc. Обратите внимание, что /usr/bin/gcc -v сообщает вам, как была настроена ваша система gcc (это необходимо сделать до перезаписи).

При компиляции недавнего GCC 4.9 на какой-нибудь старой системе я обычно рекомендую настроить его с помощью --prefix=/usr/local/ и --program-suffix=-4.9, затем добавить /usr/local/bin/ к вашему $PATH и использовать make CC=gcc-4.9 CXX=g++-4.9 для создания программ с его помощью.

person Basile Starynkevitch    schedule 22.02.2015
comment
Привет, Бэзил! Я нашел способ решить свою проблему: я убедился, что в моем /etc/ld.so.conf есть /usr/lib64 до /usr/lib/x86_64-linux-gnu/ и g++(правда, ld начинает работать нормально) затем начинает связываться без проблем (теперь действительно появляется предупреждение, когда я делаю ldconfig: ldconfig: /usr/lib64/libstdc++.so.6.0.20-gdb.py не является файлом ELF - это имеет неправильные магические байты в начале.) - но это не имеет значения, как описано здесь: readlist.com/lists/gcc.gnu.org/gcc-help/6/32889.html - person h9uest; 24.02.2015
comment
Кроме того, странная вещь, происходящая при отладке с помощью gdb, тоже исчезает. Это означает, что ранее из-за неправильной настройки каталога gdb также не мог работать (я пришел к такому выводу, потому что я НЕ перекомпилировал с помощью g++, это означает, что все символы должны были уже быть сгенерированы ранее, просто gdb не мог их найти/ работать с ним). Спасибо, что потратили время на решение этой проблемы и написание ответов - я ценю это :) - person h9uest; 24.02.2015