Очень возможно иметь несколько версий glibc в одной и той же системе (мы делаем это каждый день).
Однако вам нужно знать, что glibc состоит из множества частей (200 + разделяемых библиотек) которые все должны совпадать. Одна из частей - ld-linux.so.2, а должна соответствовать libc.so.6, или вы увидите ошибки, которые видите.
Абсолютный путь к ld-linux.so.2 жестко закодирован в исполняемый файл во время соединения и не может быть легко изменен после завершения связи.
Чтобы создать исполняемый файл, который будет работать с новым glibc , сделайте следующее:
g++ main.o -o myapp ... \
-Wl,--rpath=/path/to/newglibc \
-Wl,--dynamic-linker=/path/to/newglibc/ld-linux.so.2
Опция компоновщика -rpath
сделает загрузчик времени выполнения для поиска библиотек в /path/to/newglibc
(так что вам не нужно было бы устанавливать LD_LIBRARY_PATH
перед запуском), и параметр -dynamic-linker
будет «испечь» путь, чтобы исправить ld-linux.so.2
в приложении.
Если вы не можете повторно подключить приложение myapp
(например, потому что это сторонний двоичный файл), не все потеряно, но становится сложнее. Одно из решений - установить для него подходящую среду chroot
. Другая возможность - использовать rtldi и двоичный редактор .
Я не знаком с твердостью, но я использовал другие:
Рекурсивный значение по умолчанию для слияний неускоренной перемотки вперед. Мы все знакомы с тем.
я использовал разветвителя, когда у меня было несколько деревьев, которые должны были быть объединены. Вы видите это в больших проектах, где много ответвлений имели независимую разработку, и это все готово объединиться в единственную голову.
ответвление разветвителя объединяет многосекционные головки в одной фиксации, пока это может сделать это чисто.
Для иллюстрации, предположите, что у Вас есть проект, который имеет ведущее устройство, и затем три ответвления для слияния в (назовите их a, b, и c).
серия А рекурсивных слияний была бы похожа на это (обратите внимание, что первое слияние было ускоренной перемоткой вперед, поскольку я не вызвал рекурсию):
Однако единственное слияние разветвителя было бы похоже на это:
commit ae632e99ba0ccd0e9e06d09e8647659220d043b9
Merge: f51262e... c9ce629... aa0f25d...
Наш ==, который я хочу вытянуть в другой голове, но выбрасывать все изменения, которые представляет голова.
Это сохраняет историю ответвления без любого из эффектов ответвления.
(Read: на Это даже не смотрят изменения между теми ответвлениями. Ответвления просто объединяются, и ничто не сделано в файлы. Если Вы хотите объединиться в другом ответвлении и каждый раз, когда существует вопрос "наша версия файла или их версия", можно использовать git merge -X ours
)
, Поддерево полезно, когда Вы хотите объединиться в другом проекте в подкаталог Вашего текущего проекта. Полезный, когда у Вас есть библиотека, Вы не хотите включать как подмодуль.
На самом деле эти только две стратегии, которые Вы хотели бы выбрать, наш , если Вы хотите отказаться от изменений, внесенных ответвлением, но сохранить ответвление в истории, и поддерево при слиянии независимого проекта в подкаталог суперпроекта (как 'мерзавец-gui' в репозитории 'мерзавца').
разветвитель слияние используется автоматически при слиянии больше чем двух ответвлений. твердость здесь главным образом по историческим причинам, и по тому, когда Вы поражены рекурсивный угловые случаи стратегии слияния.
Поскольку ответы выше не показывают все детали стратегии. Например, некоторый ответ пропускает детали об импорте resolve
опция и recursive
, который имеет много sub опций как ours
, theirs
, patience
, renormalize
, и т.д.
Поэтому я рекомендовал бы посетить чиновника git
документация, которая объясняет все возможные функции функций: