Portál AbcLinuxu, 5. května 2025 13:12

Dotaz: [C] a programování s dynamickými knihovnami

23.11.2021 20:35 MilanC | skóre: 16
[C] a programování s dynamickými knihovnami
Přečteno: 578×
Odpovědět | Admin
Ahoj,

mám takový problém a asi úplně nechápu, jak je to správně.

Vykompiloval jsem si cross kompilací dynamickou knihovnu libcurl.so (na linuxu). Tato knihovna závisí na libssl a libcrypto z OpenSSL. Tyto jsem si vypřekládal jako první a curlu při kompilaci řekl, že chci podporu ssl (--with-ssl).

Potud vše OK. Vznikla mi i binárka curl, která se správně odvolává na libcrypto.so a libssl.so, SSL v ní funguje. A je znatelně menší a ldd ukazuje závislost na obou zmíněných knihovnách, takže to by mělo být OK.

Nyní se snažím použít libcurl ve svém Cčkovém projektu. Takže mám v kódu include curl.h, a v Makefile -lcurl a cestu ke knihovně libcurl.so přes -L + cestu k hlavičkovým souborům přes -I.

Jakmile do Makefile mého programu přidám -lcurl, začne mi to při překladu řvát:
/home/milanc/rtl819x-SDK-v3.4.14b-full-package/rtl819x/toolchain/msdk-4.8.5-mips-EL-3.10-u0.9.33-m32ut-180418/bin/../lib/gcc/mips-linux-uclibc/4.8.5/../../../../mips-linux-uclibc/bin/ld: warning: libssl.so.1.0.0, needed by /home/milanc/rtl819x-SDK-v3.4.14b-full-package/rtl819x/users/curl-7.79.1/lib/.libs/libcurl.so, not found (try using -rpath or -rpath-link)
/home/milanc/rtl819x-SDK-v3.4.14b-full-package/rtl819x/toolchain/msdk-4.8.5-mips-EL-3.10-u0.9.33-m32ut-180418/bin/../lib/gcc/mips-linux-uclibc/4.8.5/../../../../mips-linux-uclibc/bin/ld: warning: libcrypto.so.1.0.0, needed by /home/milanc/rtl819x-SDK-v3.4.14b-full-package/rtl819x/users/curl-7.79.1/lib/.libs/libcurl.so, not found (try using -rpath or -rpath-link)
/home/milanc/rtl819x-SDK-v3.4.14b-full-package/rtl819x/users/curl-7.79.1/lib/.libs/libcurl.so: undefined reference to `RAND_load_file'
/home/milanc/rtl819x-SDK-v3.4.14b-full-package/rtl819x/users/curl-7.79.1/lib/.libs/libcurl.so: undefined reference to `EVP_DigestInit'
/home/milanc/rtl819x-SDK-v3.4.14b-full-package/rtl819x/users/curl-7.79.1/lib/.libs/libcurl.so: undefined reference to `UI_method_set_closer'
/home/milanc/rtl819x-SDK-v3.4.14b-full-package/rtl819x/users/curl-7.79.1/lib/.libs/libcurl.so: undefined reference to `BIO_new_mem_buf'
...
A nyní jsem zmaten. Znamená to, že do mého Makefile musím cestu zase do LIBS +="-lcrypto a -lssl"? Proč? Nebo mi chybí někde nějaká cesta k těm dvěma .so z openssl? Případně kde? Ten -rpath v chybové hlášce mi nějak nic neříká. Zkusil jsem přidat na openssl (*.so) do -L, ale nepomohlo.

Nejasnost: Proč to vlastně v této fázi chce dostupnost těch openssl knihoven? Pro mu nestačí jen dosah na libcurl.so a hlavičkové soubory curlu?

Nevím si s tím moc rady a tak děkuji předem za případnou pomoc.

Řešení dotazu:


Nástroje: Začni sledovat (2) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

23.11.2021 21:57 X
Rozbalit Rozbalit vše Re: [C] a programování s dynamickými knihovnami
Odpovědět | | Sbalit | Link | Blokovat | Admin
Tvoje libcurl.so nemuze najit libssl.so.1.0.0 a libcrypto.so.1.0.0. Mas je v systemu?
Řešení 1× (Вherzet)
23.11.2021 22:21 z_sk | skóre: 34 | blog: analyzy
Rozbalit Rozbalit vše Re: [C] a programování s dynamickými knihovnami
Odpovědět | | Sbalit | Link | Blokovat | Admin
Znamená to, že do mého Makefile musím cestu zase do LIBS +="-lcrypto a -lssl"? Proč?
Áno. Linker vytvára výslednú spustiteľnú aplikáciu. Pretože môžeš máš v systéme viac knižníc s tými funkciami, tak chce vedieť s ktorou Tvoj program prepájaš.

Lebo keď voláš funkciu (myslím na najnižšej vrstve), tak sa pracuje iba s adresami (skoč na adresu XY a tam zační vykonavať kód).

Nepotrebuješ iba vtedy, ak svoju knižnicu libcurl skomplikuješ staticky.
debian.plus@protonmail.com
23.11.2021 23:14 MilanC | skóre: 16
Rozbalit Rozbalit vše Re: [C] a programování s dynamickými knihovnami
Protože je to cross kompilace, tak v systému přímo ne, reps. nejsou v systémové cestě LD_LIBRARY_PATH/LIBRARY_PATH. Jsou v jiném adresáři, který jsem ale zkusil podsouvat přes -L. No jak píšu níže, nějak jsem to už uchodil.
Řešení 1× (MilanC (tazatel))
23.11.2021 23:12 MilanC | skóre: 16
Rozbalit Rozbalit vše Re: [C] a programování s dynamickými knihovnami
Odpovědět | | Sbalit | Link | Blokovat | Admin
Už mi to funguje. I když tedy úplně nechápu rozdíl mezi -L a -Wl,rpath=... Přidal jsem do LDLIBS -Wl,rpath={cesta ke knihovnám openssl} a tváří se to spokojeně.
Řešení 1× (Вherzet)
24.11.2021 18:33 z_sk | skóre: 34 | blog: analyzy
Rozbalit Rozbalit vše Re: [C] a programování s dynamickými knihovnami
Ak chceš porozumie, tak si pozri v man gcc a odseky s názvami:
  • -Wl,option
  • -L
A pozri si:
debian.plus@protonmail.com

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.