Por que o comando openssl funciona mas a compilação da VPN falha
Um binário openssl em funcionamento não diz nada sobre cabeçalhos e bibliotecas de ligação. Verifique o pacote de desenvolvimento, a arquitetura de destino e o registo de deteção da compilação.
O terminal relata alegremente uma versão do OpenSSL, e a árvore de código-fonte continua a falhar com uma mensagem sobre cabeçalhos de criptografia em falta. Ambas as afirmações são verdadeiras ao mesmo tempo, porque uma ferramenta de execução e um conjunto de entradas de compilação são fornecidos separadamente. Faça estas quatro verificações por ordem: pacotes instalados, saída de deteção, caminhos de pesquisa e, por fim, se o próprio código-fonte é compatível. Pare na primeira que explica a falha, em vez de colar uma lista de dependências antiga.
Execução e entradas de compilação são pacotes diferentes
Uma distribuição divide o OpenSSL num pacote de execução que fornece a biblioteca partilhada e a ferramenta de linha de comandos, e num pacote de desenvolvimento que fornece cabeçalhos, nomes de ligação sem versão e metadados do pkg-config. Instalar o primeiro não instala o segundo, e o compilador só precisa do segundo.
Verifique o que está realmente presente em vez do que recorda ter instalado. Nos sistemas derivados de Debian o pacote de desenvolvimento é normalmente libssl-dev, enquanto a execução é um pacote de biblioteca com versão mais o binário openssl.
dpkg -l | grep -E 'libssl-dev|libssl3|openssl' pkg-config --modversion openssl openssl version
O primeiro comando mostra qual dos três está instalado, o segundo relata a versão que o sistema de compilação descobrirá via pkg-config, e o terceiro relata a versão de execução. Uma linha em falta na primeira saída explica o erro imediatamente. Uma discrepância de versão entre o segundo e o terceiro é outro problema, e normalmente significa que duas instalações estão a competir.
Leia a própria saída de deteção da compilação
A maioria das falhas é visível no registo de configuração se o ler antes do resumo. O módulo FindOpenSSL do CMake relata que diretório de inclusão e que bibliotecas encontrou, e falha com uma mensagem específica quando falta um componente obrigatório.
Confirme que versão do módulo o projeto usa, porque uma cópia incluída dentro da árvore de código-fonte pode comportar-se de forma diferente da que é fornecida com o CMake instalado. Depois leia a lista de componentes: um projeto que só pede Crypto não precisa da biblioteca SSL, e um que pede SSL falhará se apenas parte do pacote de desenvolvimento estiver presente.
cmake -S . -B build -DCMAKE_BUILD_TYPE=Release grep -i -E 'openssl|ssl' build/CMakeCache.txt
O primeiro comando reconfigura a partir do zero, e o segundo mostra os resultados em cache, incluindo qualquer diretório raiz ou caminho de biblioteca onde o módulo ficou. Se a cache apontar para um prefixo antigo de uma tentativa anterior, apague o diretório de compilação e configure novamente em vez de editar valores à mão. Entradas de cache obsoletas são uma causa comum de uma falha que sobrevive a uma correção correta.
Direcione a compilação para a instalação certa, de forma estreita
Quando um OpenSSL aprovado reside fora do caminho de pesquisa predefinido, o FindOpenSSL documenta OPENSSL_ROOT_DIR como uma dica para essa compilação específica. Nos sistemas do tipo Unix consulta também o pkg-config, pelo que um PKG_CONFIG_PATH adequado pode ajudar sem alterar nada globalmente.
cmake -S . -B build -DOPENSSL_ROOT_DIR=/opt/openssl-3.2 -DCMAKE_BUILD_TYPE=Release ldd build/vpn_client | grep -i ssl
O primeiro comando limita a dica a um diretório de compilação, e o segundo mostra que biblioteca partilhada o binário resultante irá carregar em tempo de execução. Uma compilação que liga ao prefixo pretendido e um binário que carrega outro constituem um problema de caminho de execução, não um problema de deteção, e exigem uma decisão sobre rpath ou a configuração do carregador em vez de mais uma opção de configuração.
Mantenha estas escolhas locais à compilação. Substituir bibliotecas do sistema ou editar ficheiros pkg-config globais para satisfazer um único projeto é a forma como um ambiente de trabalho funcional se torna avariado. Um diretório de compilação que registe o prefixo é reproduzível; uma alteração em toda a máquina é um incidente de suporte à espera do próximo projeto. Apague o diretório de compilação quando alterar a dica, para que a cache não possa guardar a resposta antiga.
Saiba quando o problema é o código-fonte
Um passo de configuração bem-sucedido prova apenas que as verificações terminaram. A compilação ainda pode rejeitar uma API que o código-fonte espera, e a ligação ainda pode falhar por um símbolo em falta. Guarde o primeiro erro específico de cada etapa, porque os posteriores são normalmente consequências.
O OpenSSL 3 marcou como obsoletas e removeu várias interfaces que os clientes VPN mais antigos usam diretamente, pelo que uma árvore de código-fonte dessa época pode precisar de alterações reais em vez de um novo caminho de inclusão. Se os mantenedores suportarem uma versão atual, use-a. Se não, a decisão pertence a quem é dono do serviço, não a uma procura de um nome de ficheiro de biblioteca mais antigo.
Os componentes opcionais de ambiente de trabalho também têm os seus requisitos. Um alvo de linha de comandos que se configura de forma limpa nada diz sobre se o conjunto de ferramentas GUI e o editor serão compilados, por isso trate uma lista antiga de pacotes Qt como história e não como especificação. Verifique as opções próprias da revisão do código-fonte para saber que interfaces estão ativadas por omissão. Depois compile apenas o que precisar, porque cada dependência opcional é outro problema de deteção à espera de acontecer.