Emitir
Esta pergunta e respostas contendo várias abordagens para resolvê-la surgem muitas vezes quase diariamente em nosso intercâmbio aqui. Se um resultado de pesquisa trouxe você aqui Bem-vindo! Se um comentário que deixei em sua pergunta tiver um link aqui, você pode assumir com segurança que sua pergunta pode ser adicionada à lista abaixo, pois se enquadra na mesma categoria:
- Desacordo entre glib e gcc após o downgrade do gcc
- Como posso fazer o downgrade para uma versão específica do gcc no Fedora 39?
- Como posso instalar alguns compiladores gcc no arch linux?
- Debian Bullseye: Instale gcc-11.4.0 e dependências
Essas são apenas quatro das muitas perguntas marcadas [gcc]
com o downgrade do termo de pesquisa. Aqueles leitores/usuários com conhecimento suficiente para chegar primeiro à exchange quase sempre perguntam Como posso..." Aqueles leitores azarados que tentaram algo que falhou quase sempre têm a frase "Quebrou", ou "Acho que quebrei alguma coisa". esta pergunta e resposta, tentarei explicar Por que misturar compiladores quebra todos os Linux e, na resposta, fornecerei a maneira mais simples que conheço para corrigir o problema, que não causa quebra, mas custa um pouco de sobrecarga em termos de tempo e espaço para configuração. Como esta será uma pergunta e resposta contribuída pela comunidade, peço que você vote positivamente se gostar da minha abordagem.
Problema explicado
TLDR : Vá para Por que o downgrade dos compiladores causa problemas?
Usei a imagem abaixo duas ou três vezes aqui em várias respostas e sinto que ela fornece a todos nós um bom lugar para começar. Sei que é grande e, como tal, peço aos leitores que o abram em uma guia separada e apliquem zoom, etc., se desejarem.
Encontre sua distribuição nessa lista e continue lendo. Você notará que sua distribuição tem uma distribuição pai. OK, OK, eu sei que os leitores que usam as distribuições principais (aquelas na extremidade esquerda da linha do tempo) estão perguntando:
Estou usando um dos da extrema esquerda, então onde estão seus pais?
E agora chegamos ao cerne desta questão. Por exemplo, vamos preencher $X
e $Y
a partir do meu título (Paciência Leitores, $Z
está chegando)
$X = Fedora 39
$Y = 13.2.1-6.fc39
Definições
- Distribution (Quoting Wikipedia):
A Linux distribution (often abbreviated as distro) is an operating system made from a software collection that includes the Linux kernel and often a package management system.
- Package Management System (Quoting Again):
A package manager or package-management system is a collection of software tools that automates the process of installing, upgrading, configuring, and removing computer programs for a computer in a consistent manner
Knowing these two items helps us answer the Parent Distribution question, but unfortunately with another question: How Do the distribution maintainers create a distribution?
The Answer: All linux software minus the kernel is stored at and can be obtained from the GNU Software FTP Site in source code archives. All Linux Kernels are available for download in source code archives at The Linux Kernel Archives. In short, all Distributions begin from the same source code, including the parent distributions
Why Does Downgrading Compilers Cause Issues?
From the definition earlier, a distribution is a group or set of related software. This relation can be seen in your distribution's repository (or whatever else your distribution has chosen to name it).
At the time a new version (in our Example $X
= Fedora 39) is made available the repository for that version is locked, specifically version locked, meaning that every package in that repository is now frozen in time. Once frozen it isn't altered. It can only live as long as the version is supported or die when the version is upgraded.
The tools required to build GCC are also in the now frozen repository. If a user attempts to upgrade or downgrade the GCC that was shipped in the frozen repository, the version locking would be broken if you were to succeed. To prevent the breakage from happening, your OS'es Package Manager prevents this.
Read my answer to find out how I overcame $Z
A less heavyweight solution is to use containers. Install Docker or Podman, and follow the recipe in eyoung100’s answer to identify the distribution release you’re after, or look it up on Repology.
Using the same Fedora 36 example, run a container:
Você pode adicionar
-v
opções para disponibilizar diretórios em seu sistema dentro do contêiner:(adicione apenas
:z
se estiver usando SELinux).No contêiner, instale
gcc
e quaisquer outras ferramentas necessárias, construa seu projeto (em/myproject
) e você encontrará seus arquivos no diretório que você compartilhou.My Solution
First off, I guess I would be considered a purist in that if a package isn't in your repository, or can't be added from a third party repository, you shouldn't attempt to compile it from scratch or "force it to work" because doing so short-circuits your package manager. With that in mind, I present a rock-solid solution
Virtualization Is Our Friend
We need some tools and a bit of Hard Drive Space for this approach. I'll leave making space available to you but aside from that follow these steps:
Note: Vagrant will work with Hyper-V and docker out of the box I believe (see Stephen Kitt's answer for help with docker), but I chose VirtualBox because that's what I learned first, and if needed I can install a Desktop in the VM to configure the VM further.
With our Virtualization Helpers installed we can continue. I'm continuing by:
$Z
now. Using Example question 2 from the Issue heading above we have the following values:$X = Fedora
$Y = 13.2.1-6.fc39
$Z = 12.x.x
So using our example: Which release of Fedora contained GCC 12. Now Quoting Google:
$X release history
Which would equate to Fedora release history in our example, which gives us Fedora Linux release history. Well, what do we do now? It looks like Fedora 36 is no longer supported. We added Vagrant for this very reason. If we visit The Vagrant Cloud, we can search for Fedora 36, which yields these results, and using a Vagrantfile, we can customize a full VM version and develop our application or website using the VM while saving our project files on our host system.
Reason Why I Chose This Approach
Using virtualization separates your development environment from the system you use day-to-day, and keeps you from making an irreparable mistake. I realize it will cost a bit of extra setup time, but Vagrant only needs to be installed once. A vagrantfile only needs to be created each time your project requirements change. The small learning curve for Vagrant and the Virtualization is worth the tradeoff of reinstalling an OS if a mistake is made trying to figure out how to install multiple compilers.