Ինչու է 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 փաթեթների ցանկը վերաբերվեք որպես պատմություն, այլ ոչ թե որպես սահմանում։ Ստուգեք սկզբնաղբյուրի վերանայման սեփական ընտրանքները, թե որ միջերեսներն են լռելյայն միացված։ Ապա կառուցեք միայն այն, ինչ ձեզ պետք է, քանի որ յուրաքանչյուր լրացուցիչ կախվածություն ևս մեկ որոնման խնդիր է, որը սպասում է տեղի ունենալուն։