openssl ਹੁਕਮ ਕਿਉਂ ਕੰਮ ਕਰਦਾ ਹੈ ਪਰ VPN ਬਿਲਡ ਕਿਉਂ ਫੇਲ ਹੁੰਦਾ ਹੈ
ਕੰਮ ਕਰਦਾ openssl ਬਾਈਨਰੀ ਹੈਡਰ ਅਤੇ ਲਿੰਕ ਲਾਇਬ੍ਰੇਰੀਆਂ ਬਾਰੇ ਕੁਝ ਨਹੀਂ ਦੱਸਦਾ। ਡੈਵ ਪੈਕੇਜ, ਟਾਰਗਟ ਆਰਕੀਟੈਕਚਰ ਅਤੇ ਬਿਲਡ ਦਾ ਡਿਸਕਵਰੀ ਲੌਗ ਜਾਂਚੋ।
ਟਰਮੀਨਲ ਖੁਸ਼ੀ ਨਾਲ OpenSSL ਦਾ ਸੰਸਕਰਣ ਦੱਸਦਾ ਹੈ, ਅਤੇ ਸਰੋਤ ਰੁੱਖ ਅਜੇ ਵੀ ਗੁੰਮ ਕ੍ਰਿਪਟੋ ਹੈਡਰਾਂ ਬਾਰੇ ਸੁਨੇਹੇ ਨਾਲ ਫੇਲ ਹੁੰਦਾ ਹੈ। ਦੋਵੇਂ ਕਥਨ ਇਕੱਠੇ ਸੱਚ ਹਨ, ਕਿਉਂਕਿ ਰਨਟਾਈਮ ਟੂਲ ਅਤੇ ਬਿਲਡ ਇਨਪੁਟਾਂ ਦਾ ਸਮੂਹ ਵੱਖਰੇ ਤੌਰ 'ਤੇ ਭੇਜੇ ਜਾਂਦੇ ਹਨ। ਇਹ ਚਾਰ ਜਾਂਚਾਂ ਕ੍ਰਮ ਵਿੱਚ ਕਰੋ: ਇੰਸਟਾਲ ਕੀਤੇ ਪੈਕੇਜ, ਡਿਸਕਵਰੀ ਆਉਟਪੁੱਟ, ਖੋਜ ਮਾਰਗ, ਅਤੇ ਫਿਰ ਇਹ ਕਿ ਸਰੋਤ ਆਪ ਹੀ ਅਨੁਕੂਲ ਹੈ ਜਾਂ ਨਹੀਂ। ਪੁਰਾਣੀ ਨਿਰਭਰਤਾ ਸੂਚੀ ਚਿਪਕਾਉਣ ਦੀ ਥਾਂ ਉਸ ਪਹਿਲੀ ਜਾਂਚ 'ਤੇ ਰੁਕੋ ਜੋ ਫੇਲ ਹੋਣ ਦੀ ਵਿਆਖਿਆ ਕਰਦੀ ਹੈ।
ਰਨਟਾਈਮ ਅਤੇ ਬਿਲਡ ਇਨਪੁਟ ਵੱਖਰੇ ਪੈਕੇਜ ਹਨ
ਇੱਕ ਡਿਸਟਰੀਬਿਊਸ਼ਨ OpenSSL ਨੂੰ ਰਨਟਾਈਮ ਪੈਕੇਜ ਵਿੱਚ ਵੰਡਦਾ ਹੈ ਜੋ ਸਾਂਝੀ ਲਾਇਬ੍ਰੇਰੀ ਅਤੇ ਕਮਾਂਡ ਲਾਈਨ ਟੂਲ ਦਿੰਦਾ ਹੈ, ਅਤੇ ਡਿਵੈਲਪਮੈਂਟ ਪੈਕੇਜ ਵਿੱਚ ਜੋ ਹੈਡਰ, ਬਿਨਾਂ ਸੰਸਕਰਣ ਦੇ ਲਿੰਕਰ ਨਾਮ ਅਤੇ pkg-config ਮੈਟਾਡੇਟਾ ਦਿੰਦਾ ਹੈ। ਪਹਿਲਾ ਇੰਸਟਾਲ ਕਰਨਾ ਦੂਜਾ ਇੰਸਟਾਲ ਨਹੀਂ ਕਰਦਾ, ਅਤੇ ਕੰਪਾਈਲਰ ਨੂੰ ਸਿਰਫ਼ ਦੂਜਾ ਚਾਹੀਦਾ ਹੈ।
ਤੁਸੀਂ ਕੀ ਇੰਸਟਾਲ ਕੀਤਾ ਯਾਦ ਹੈ ਉਸ ਦੀ ਥਾਂ ਅਸਲ ਵਿੱਚ ਕੀ ਮੌਜੂਦ ਹੈ ਉਹ ਜਾਂਚੋ। Debian ਅਧਾਰਿਤ ਸਿਸਟਮਾਂ ਵਿੱਚ ਡਿਵੈਲਪਮੈਂਟ ਪੈਕੇਜ ਆਮ ਤੌਰ 'ਤੇ libssl-dev ਹੁੰਦਾ ਹੈ, ਜਦਕਿ ਰਨਟਾਈਮ ਸੰਸਕਰਣ ਵਾਲਾ ਲਾਇਬ੍ਰੇਰੀ ਪੈਕੇਜ ਅਤੇ openssl ਬਾਈਨਰੀ ਹੈ।
dpkg -l | grep -E 'libssl-dev|libssl3|openssl' pkg-config --modversion openssl openssl version
ਪਹਿਲਾ ਹੁਕਮ ਦਿਖਾਉਂਦਾ ਹੈ ਕਿ ਤਿੰਨਾਂ ਵਿੱਚੋਂ ਕਿਹੜਾ ਇੰਸਟਾਲ ਹੈ, ਦੂਜਾ ਉਹ ਸੰਸਕਰਣ ਦੱਸਦਾ ਹੈ ਜੋ ਬਿਲਡ ਸਿਸਟਮ pkg-config ਰਾਹੀਂ ਲੱਭੇਗਾ, ਅਤੇ ਤੀਜਾ ਰਨਟਾਈਮ ਸੰਸਕਰਣ ਦੱਸਦਾ ਹੈ। ਪਹਿਲੇ ਆਉਟਪੁੱਟ ਵਿੱਚ ਗੁੰਮ ਲਾਈਨ ਤਰੁੱਟੀ ਨੂੰ ਤੁਰੰਤ ਸਮਝਾਉਂਦੀ ਹੈ। ਦੂਜੇ ਅਤੇ ਤੀਜੇ ਵਿਚਕਾਰ ਸੰਸਕਰਣ ਦਾ ਅੰਤਰ ਦੂਜੀ ਸਮੱਸਿਆ ਹੈ, ਅਤੇ ਆਮ ਤੌਰ 'ਤੇ ਇਸ ਦਾ ਅਰਥ ਹੈ ਕਿ ਦੋ ਇੰਸਟਾਲ ਮੁਕਾਬਲਾ ਕਰ ਰਹੇ ਹਨ।
ਬਿਲਡ ਦਾ ਆਪਣਾ ਡਿਸਕਵਰੀ ਆਉਟਪੁੱਟ ਪੜ੍ਹੋ
ਸੰਖੇਪ ਤੋਂ ਪਹਿਲਾਂ ਪੜ੍ਹਨ 'ਤੇ ਜ਼ਿਆਦਾਤਰ ਫੇਲਤਾਂ ਕਾਨਫਿਗਰ ਲੌਗ ਵਿੱਚ ਦਿਸਦੀਆਂ ਹਨ। CMake ਦਾ FindOpenSSL ਮਾਡਿਊਲ ਦੱਸਦਾ ਹੈ ਕਿ ਕਿਹੜੀ include ਡਾਇਰੈਕਟਰੀ ਅਤੇ ਕਿਹੜੀਆਂ ਲਾਇਬ੍ਰੇਰੀਆਂ ਮਿਲੀਆਂ, ਅਤੇ ਲੋੜੀਂਦਾ ਹਿੱਸਾ ਨਾ ਹੋਣ 'ਤੇ ਵਿਸ਼ੇਸ਼ ਸੁਨੇਹੇ ਨਾਲ ਫੇਲ ਹੁੰਦਾ ਹੈ।
ਪੱਕਾ ਕਰੋ ਕਿ ਪ੍ਰੋਜੈਕਟ ਕਿਹੜਾ ਮਾਡਿਊਲ ਸੰਸਕਰਣ ਵਰਤਦਾ ਹੈ, ਕਿਉਂਕਿ ਸਰੋਤ ਰੁੱਖ ਦੇ ਅੰਦਰ ਬੰਡਲ ਕੀਤੀ ਨਕਲ ਇੰਸਟਾਲ ਕੀਤੇ CMake ਨਾਲ ਆਉਣ ਵਾਲੀ ਨਕਲ ਤੋਂ ਵੱਖਰਾ ਵਿਵਹਾਰ ਕਰ ਸਕਦੀ ਹੈ। ਫਿਰ ਹਿੱਸਿਆਂ ਦੀ ਸੂਚੀ ਪੜ੍ਹੋ: ਸਿਰਫ਼ Crypto ਮੰਗਣ ਵਾਲੇ ਪ੍ਰੋਜੈਕਟ ਨੂੰ SSL ਲਾਇਬ੍ਰੇਰੀ ਦੀ ਲੋੜ ਨਹੀਂ, ਅਤੇ SSL ਮੰਗਣ ਵਾਲਾ ਪ੍ਰੋਜੈਕਟ ਫੇਲ ਹੋਵੇਗਾ ਜੇ ਡਿਵੈਲਪਮੈਂਟ ਪੈਕੇਜ ਦਾ ਸਿਰਫ਼ ਇੱਕ ਹਿੱਸਾ ਮੌਜੂਦ ਹੋਵੇ।
cmake -S . -B build -DCMAKE_BUILD_TYPE=Release grep -i -E 'openssl|ssl' build/CMakeCache.txt
ਪਹਿਲਾ ਹੁਕਮ ਸ਼ੁਰੂ ਤੋਂ ਮੁੜ ਕਾਨਫਿਗਰ ਕਰਦਾ ਹੈ, ਅਤੇ ਦੂਜਾ ਕੈਸ਼ ਕੀਤੇ ਨਤੀਜੇ ਦਿਖਾਉਂਦਾ ਹੈ, ਜਿਸ ਵਿੱਚ ਕੋਈ ਵੀ ਰੂਟ ਡਾਇਰੈਕਟਰੀ ਜਾਂ ਲਾਇਬ੍ਰੇਰੀ ਮਾਰਗ ਸ਼ਾਮਲ ਹੈ ਜਿਸ 'ਤੇ ਮਾਡਿਊਲ ਰੁਕਿਆ। ਜੇ ਕੈਸ਼ ਪਿਛਲੇ ਯਤਨ ਦੇ ਪੁਰਾਣੇ ਪ੍ਰੀਫਿਕਸ ਵੱਲ ਇਸ਼ਾਰਾ ਕਰਦਾ ਹੈ, ਤਾਂ ਮੁੱਲ ਹੱਥ ਨਾਲ ਸੰਪਾਦਿਤ ਕਰਨ ਦੀ ਥਾਂ ਬਿਲਡ ਡਾਇਰੈਕਟਰੀ ਮਿਟਾਓ ਅਤੇ ਮੁੜ ਕਾਨਫਿਗਰ ਕਰੋ। ਬਾਸੀ ਕੈਸ਼ ਐਂਟਰੀਆਂ ਸਹੀ ਸੁਧਾਰ ਤੋਂ ਬਾਅਦ ਵੀ ਰਹਿਣ ਵਾਲੀ ਫੇਲਤਾ ਦਾ ਆਮ ਕਾਰਣ ਹਨ।
ਬਿਲਡ ਨੂੰ ਸਹੀ ਇੰਸਟਾਲ ਵੱਲ ਤੰਗ ਤੌਰ 'ਤੇ ਨਿਰਦੇਸ਼ਤ ਕਰੋ
ਜਦੋਂ ਮਨਜ਼ੂਰ OpenSSL ਡਿਫ਼ਾਲਟ ਖੋਜ ਮਾਰਗ ਤੋਂ ਬਾਹਰ ਹੁੰਦਾ ਹੈ, FindOpenSSL OPENSSL_ROOT_DIR ਨੂੰ ਉਸ ਖਾਸ ਬਿਲਡ ਲਈ ਸੰਕੇਤ ਵਜੋਂ ਦਰਜ ਕਰਦਾ ਹੈ। Unix ਵਰਗੇ ਸਿਸਟਮਾਂ ਵਿੱਚ ਇਹ pkg-config ਨੂੰ ਵੀ ਪੁੱਛਦਾ ਹੈ, ਇਸ ਲਈ ਢੁੱਕਵਾਂ PKG_CONFIG_PATH ਵਿਸ਼ਵਵਿਆਪੀ ਤੌਰ 'ਤੇ ਕੁਝ ਬਦਲੇ ਬਿਨਾਂ ਮਦਦ ਕਰ ਸਕਦਾ ਹੈ।
cmake -S . -B build -DOPENSSL_ROOT_DIR=/opt/openssl-3.2 -DCMAKE_BUILD_TYPE=Release ldd build/vpn_client | grep -i ssl
ਪਹਿਲਾ ਹੁਕਮ ਸੰਕੇਤ ਨੂੰ ਇੱਕ ਬਿਲਡ ਡਾਇਰੈਕਟਰੀ ਤੱਕ ਸੀਮਿਤ ਕਰਦਾ ਹੈ, ਅਤੇ ਦੂਜਾ ਦਿਖਾਉਂਦਾ ਹੈ ਕਿ ਨਤੀਜਾ ਬਾਈਨਰੀ ਰਨਟਾਈਮ ਵਿੱਚ ਕਿਹੜੀ ਸਾਂਝੀ ਲਾਇਬ੍ਰੇਰੀ ਲੋਡ ਕਰੇਗੀ। ਇੱਛਤ ਪ੍ਰੀਫਿਕਸ ਨਾਲ ਲਿੰਕ ਹੋਣ ਵਾਲਾ ਬਿਲਡ ਅਤੇ ਦੂਜੀ ਲੋਡ ਕਰਨ ਵਾਲੀ ਬਾਈਨਰੀ ਰਨਟਾਈਮ ਮਾਰਗ ਦੀ ਸਮੱਸਿਆ ਹੈ, ਡਿਸਕਵਰੀ ਦੀ ਨਹੀਂ, ਅਤੇ ਇਸ ਲਈ ਦੂਜੇ ਕਾਨਫਿਗਰ ਫਲੈਗ ਦੀ ਥਾਂ rpath ਜਾਂ ਲੋਡਰ ਕਾਨਫਿਗਰੇਸ਼ਨ ਦਾ ਫ਼ੈਸਲਾ ਚਾਹੀਦਾ ਹੈ।
ਇਹ ਚੋਣਾਂ ਬਿਲਡ ਤੱਕ ਹੀ ਸਥਾਨਕ ਰੱਖੋ। ਇੱਕ ਪ੍ਰੋਜੈਕਟ ਨੂੰ ਸੰਤੁਸ਼ਟ ਕਰਨ ਲਈ ਸਿਸਟਮ ਲਾਇਬ੍ਰੇਰੀਆਂ ਬਦਲਣਾ ਜਾਂ ਵਿਸ਼ਵਵਿਆਪੀ pkg-config ਫਾਈਲਾਂ ਸੰਪਾਦਿਤ ਕਰਨਾ ਉਹ ਰਾਹ ਹੈ ਜਿਸ ਨਾਲ ਕੰਮ ਕਰਦਾ ਡੈਸਕਟਾਪ ਟੁੱਟਿਆ ਡੈਸਕਟਾਪ ਬਣ ਜਾਂਦਾ ਹੈ। ਪ੍ਰੀਫਿਕਸ ਦਰਜ ਕਰਨ ਵਾਲੀ ਬਿਲਡ ਡਾਇਰੈਕਟਰੀ ਦੁਬਾਰਾ ਤਿਆਰ ਕਰਨ ਯੋਗ ਹੈ; ਪੂਰੀ ਮਸ਼ੀਨ 'ਤੇ ਤਬਦੀਲੀ ਅਗਲੇ ਪ੍ਰੋਜੈਕਟ ਦੀ ਉਡੀਕ ਕਰਦੀ ਸਹਾਇਤਾ ਘਟਨਾ ਹੈ। ਜਦੋਂ ਤੁਸੀਂ ਸੰਕੇਤ ਬਦਲੋ ਤਾਂ ਬਿਲਡ ਡਾਇਰੈਕਟਰੀ ਮਿਟਾਓ, ਤਾਂ ਜੋ ਕੈਸ਼ ਪੁਰਾਣਾ ਜਵਾਬ ਨਾ ਰੱਖ ਸਕੇ।
ਜਾਣੋ ਕਿ ਸਮੱਸਿਆ ਕਦੋਂ ਸਰੋਤ ਵਿੱਚ ਹੀ ਹੈ
ਸਫਲ ਕਾਨਫਿਗਰ ਕਦਮ ਸਿਰਫ਼ ਇਹ ਸਾਬਤ ਕਰਦਾ ਹੈ ਕਿ ਜਾਂਚਾਂ ਪੂਰੀਆਂ ਹੋਈਆਂ। ਕੰਪਾਈਲੇਸ਼ਨ ਅਜੇ ਵੀ ਉਸ API ਨੂੰ ਰੱਦ ਕਰ ਸਕਦਾ ਹੈ ਜਿਸ ਦੀ ਸਰੋਤ ਉਮੀਦ ਕਰਦਾ ਹੈ, ਅਤੇ ਲਿੰਕਿੰਗ ਗੁੰਮ ਚਿੰਨ੍ਹ ਕਾਰਨ ਅਜੇ ਵੀ ਫੇਲ ਹੋ ਸਕਦੀ ਹੈ। ਹਰ ਪੜਾਅ ਦੀ ਪਹਿਲੀ ਵਿਸ਼ੇਸ਼ ਤਰੁੱਟੀ ਰੱਖੋ, ਕਿਉਂਕਿ ਬਾਅਦ ਵਾਲੀਆਂ ਆਮ ਤੌਰ 'ਤੇ ਨਤੀਜੇ ਹੁੰਦੀਆਂ ਹਨ।
OpenSSL 3 ਨੇ ਕਈ ਇੰਟਰਫੇਸਾਂ ਨੂੰ ਪੁਰਾਣਾ ਘੋਸ਼ਿਤ ਕੀਤਾ ਅਤੇ ਹਟਾਇਆ ਜੋ ਪੁਰਾਣੇ VPN ਕਲਾਇੰਟ ਸਿੱਧੇ ਵਰਤਦੇ ਹਨ, ਇਸ ਲਈ ਉਸ ਯੁੱਗ ਦੇ ਸਰੋਤ ਰੁੱਖ ਨੂੰ ਨਵੇਂ include ਮਾਰਗ ਦੀ ਥਾਂ ਅਸਲ ਬਦਲਾਅ ਚਾਹੀਦੇ ਹੋ ਸਕਦੇ ਹਨ। ਜੇ ਸੰਭਾਲਕਰਤਾ ਮੌਜੂਦਾ ਰਿਲੀਜ਼ ਦਾ ਸਮਰਥਨ ਕਰਦੇ ਹਨ ਤਾਂ ਉਹੀ ਵਰਤੋ। ਜੇ ਨਹੀਂ, ਫ਼ੈਸਲਾ ਸੇਵਾ ਦੇ ਮਾਲਕ ਦਾ ਹੈ, ਪੁਰਾਣੇ ਲਾਇਬ੍ਰੇਰੀ ਫਾਈਲ ਨਾਮ ਦੀ ਖੋਜ ਦਾ ਨਹੀਂ।
ਵਿਕਲਪਿਕ ਡੈਸਕਟਾਪ ਹਿੱਸਿਆਂ ਦੀਆਂ ਵੀ ਆਪਣੀਆਂ ਲੋੜਾਂ ਹਨ। ਸਾਫ਼ ਕਾਨਫਿਗਰ ਹੋਣ ਵਾਲਾ ਕਮਾਂਡ ਲਾਈਨ ਟਾਰਗਟ ਇਸ ਬਾਰੇ ਕੁਝ ਨਹੀਂ ਦੱਸਦਾ ਕਿ GUI ਟੂਲਕਿਟ ਅਤੇ ਐਡੀਟਰ ਬਣਨਗੇ ਜਾਂ ਨਹੀਂ, ਇਸ ਲਈ ਪੁਰਾਣੀ Qt ਪੈਕੇਜ ਸੂਚੀ ਨੂੰ ਵਿਸ਼ੇਸ਼ਤਾ ਦੀ ਥਾਂ ਇਤਿਹਾਸ ਮੰਨੋ। ਕਿਹੜੇ ਇੰਟਰਫੇਸ ਡਿਫ਼ਾਲਟ ਰੂਪ ਵਿੱਚ ਸਮਰੱਥ ਹਨ ਇਹ ਸਰੋਤ ਦੋਹਰਾਈ ਦੇ ਆਪਣੇ ਵਿਕਲਪਾਂ ਵਿੱਚ ਜਾਂਚੋ। ਫਿਰ ਸਿਰਫ਼ ਉਹੀ ਬਣਾਓ ਜੋ ਤੁਹਾਨੂੰ ਚਾਹੀਦਾ ਹੈ, ਕਿਉਂਕਿ ਹਰ ਵਿਕਲਪਿਕ ਨਿਰਭਰਤਾ ਹੋਣ ਦੀ ਉਡੀਕ ਕਰਦੀ ਇੱਕ ਹੋਰ ਡਿਸਕਵਰੀ ਸਮੱਸਿਆ ਹੈ।