# Zig bindings to libcurl

**URL:** <https://ziggit.dev/t/zig-bindings-to-libcurl/1768>\
**Category:** Showcase\
**Created:** [September 17, 2023, 5:20am UTC](https://ziggit.dev/t/zig-bindings-to-libcurl/1768 "2023-09-17T05:20:35Z")\
**Posts on this page:** 8\
**Page:** 1

<div class="post-metadata">

**Author:** ![jiacai2050](https://ziggit.dev/user_avatar/ziggit.dev/jiacai2050/32/3657_2.png) [@jiacai2050](https://ziggit.dev/u/jiacai2050)\
**Post date:** [September 17, 2023, 5:20am UTC](https://ziggit.dev/t/zig-bindings-to-libcurl/1768/1 "2023-09-17T05:20:35Z")

</div>

Hi guys, I create a libcurl bindings, check it out if you need stable HTTP access in Zig.

> **[GitHub - jiacai2050/zig-curl: Zig bindings for libcurl](https://github.com/jiacai2050/zig-curl)**
>
> Zig bindings for libcurl. Contribute to jiacai2050/zig-curl development by creating an account on GitHub.

As always, any feedback is welcome!

---

<div class="post-metadata">

**Author:** ![neurocyte](https://ziggit.dev/user_avatar/ziggit.dev/neurocyte/32/3804_2.png) [@neurocyte](https://ziggit.dev/u/neurocyte)\
**Post date:** [September 18, 2023, 9:39am UTC](https://ziggit.dev/t/zig-bindings-to-libcurl/1768/2 "2023-09-18T09:39:35Z")

</div>

Is libcurl difficult to build?

It would be great to have a zig package that builds libcurl with zig so that your bindings can be used without adding a system library dependency. This is especially cool for cross compilation.

---

<div class="post-metadata">

**Author:** ![jiacai2050](https://ziggit.dev/user_avatar/ziggit.dev/jiacai2050/32/3657_2.png) [@jiacai2050](https://ziggit.dev/u/jiacai2050)\
**Post date:** [September 18, 2023, 2:25pm UTC](https://ziggit.dev/t/zig-bindings-to-libcurl/1768/3 "2023-09-18T14:25:25Z")

</div>

Bundle static libcurl is a non-trivial task.

libcurl depends on many other libs, such as libz/nghttp2/openssl, if we want to cross compile, we need to static build them all.

This is what I got by `ldd` [basic example](https://github.com/jiacai2050/zig-curl/blob/main/examples/basic.zig) on a debian box (libcurl is installed by `libcurl4-openssl-dev` package):

```zig
root@69f7632577fd:/app# ldd zig-out/bin/basic 
	linux-vdso.so.1 (0x0000ffffa7560000)
	libcurl.so.4 => /usr/lib/aarch64-linux-gnu/libcurl.so.4 (0x0000ffffa748c000)
	libpthread.so.0 => /lib/aarch64-linux-gnu/libpthread.so.0 (0x0000ffffa745b000)
	libc.so.6 => /lib/aarch64-linux-gnu/libc.so.6 (0x0000ffffa72e7000)
	/lib/ld-linux-aarch64.so.1 (0x0000ffffa7530000)
	libnghttp2.so.14 => /usr/lib/aarch64-linux-gnu/libnghttp2.so.14 (0x0000ffffa72ac000)
	libidn2.so.0 => /usr/lib/aarch64-linux-gnu/libidn2.so.0 (0x0000ffffa727c000)
	librtmp.so.1 => /usr/lib/aarch64-linux-gnu/librtmp.so.1 (0x0000ffffa724f000)
	libssh2.so.1 => /usr/lib/aarch64-linux-gnu/libssh2.so.1 (0x0000ffffa720d000)
	libpsl.so.5 => /usr/lib/aarch64-linux-gnu/libpsl.so.5 (0x0000ffffa71eb000)
	libssl.so.1.1 => /usr/lib/aarch64-linux-gnu/libssl.so.1.1 (0x0000ffffa714e000)
	libcrypto.so.1.1 => /usr/lib/aarch64-linux-gnu/libcrypto.so.1.1 (0x0000ffffa6ea0000)
	libgssapi_krb5.so.2 => /usr/lib/aarch64-linux-gnu/libgssapi_krb5.so.2 (0x0000ffffa6e42000)
	libldap_r-2.4.so.2 => /usr/lib/aarch64-linux-gnu/libldap_r-2.4.so.2 (0x0000ffffa6ddd000)
	liblber-2.4.so.2 => /usr/lib/aarch64-linux-gnu/liblber-2.4.so.2 (0x0000ffffa6dbe000)
	libbrotlidec.so.1 => /usr/lib/aarch64-linux-gnu/libbrotlidec.so.1 (0x0000ffffa6da3000)
	libz.so.1 => /lib/aarch64-linux-gnu/libz.so.1 (0x0000ffffa6d79000)
	libunistring.so.2 => /usr/lib/aarch64-linux-gnu/libunistring.so.2 (0x0000ffffa6bed000)
	libgnutls.so.30 => /usr/lib/aarch64-linux-gnu/libgnutls.so.30 (0x0000ffffa69d1000)
	libhogweed.so.6 => /usr/lib/aarch64-linux-gnu/libhogweed.so.6 (0x0000ffffa6979000)
	libnettle.so.8 => /usr/lib/aarch64-linux-gnu/libnettle.so.8 (0x0000ffffa6926000)
	libgmp.so.10 => /usr/lib/aarch64-linux-gnu/libgmp.so.10 (0x0000ffffa689e000)
	libgcrypt.so.20 => /usr/lib/aarch64-linux-gnu/libgcrypt.so.20 (0x0000ffffa67ce000)
	libdl.so.2 => /lib/aarch64-linux-gnu/libdl.so.2 (0x0000ffffa67ba000)
	libkrb5.so.3 => /usr/lib/aarch64-linux-gnu/libkrb5.so.3 (0x0000ffffa66cf000)
	libk5crypto.so.3 => /usr/lib/aarch64-linux-gnu/libk5crypto.so.3 (0x0000ffffa6691000)
	libcom_err.so.2 => /lib/aarch64-linux-gnu/libcom_err.so.2 (0x0000ffffa667d000)
	libkrb5support.so.0 => /usr/lib/aarch64-linux-gnu/libkrb5support.so.0 (0x0000ffffa6660000)
	libresolv.so.2 => /lib/aarch64-linux-gnu/libresolv.so.2 (0x0000ffffa6639000)
	libsasl2.so.2 => /usr/lib/aarch64-linux-gnu/libsasl2.so.2 (0x0000ffffa660d000)
	libbrotlicommon.so.1 => /usr/lib/aarch64-linux-gnu/libbrotlicommon.so.1 (0x0000ffffa65da000)
	libp11-kit.so.0 => /usr/lib/aarch64-linux-gnu/libp11-kit.so.0 (0x0000ffffa648b000)
	libtasn1.so.6 => /usr/lib/aarch64-linux-gnu/libtasn1.so.6 (0x0000ffffa6467000)
	libgpg-error.so.0 => /lib/aarch64-linux-gnu/libgpg-error.so.0 (0x0000ffffa6434000)
	libkeyutils.so.1 => /lib/aarch64-linux-gnu/libkeyutils.so.1 (0x0000ffffa641f000)
	libffi.so.7 => /usr/lib/aarch64-linux-gnu/libffi.so.7 (0x0000ffffa6404000)

```

Libcurl rust bindings support static built libcurl, but still leaves other dependencies dynamic link.

> <https://github.com/alexcrichton/curl-rust/blob/3dc087286d05b2e035b5b923c8a1ba174291e443/curl-sys/build.rs#L253C6-L253C6>

Would you mind file an issue describing what we can get by bundle static libcurl?

---

<div class="post-metadata">

**Author:** ![Luke](https://ziggit.dev/letter_avatar_proxy/v4/letter/l/7ab992/32.png) [@Luke](https://ziggit.dev/u/Luke)\
**Post date:** [September 19, 2023, 1:42pm UTC](https://ziggit.dev/t/zig-bindings-to-libcurl/1768/4 "2023-09-19T13:42:14Z")

</div>

> [@jiacai2050](#):
>
> libz

FYI, a certain Andrew K already zigged libz: [GitHub - andrewrk/libz: zlib with the build system replaced by zig](https://github.com/andrewrk/libz). openssl also seems zigged: [GitHub - kassane/openssl-zig: TLS/SSL and crypto library (uses Zig Build)](https://github.com/kassane/openssl-zig).

---

<div class="post-metadata">

**Author:** ![Sze](https://ziggit.dev/user_avatar/ziggit.dev/sze/32/496_2.png) [@Sze](https://ziggit.dev/u/Sze)\
**Post date:** [September 21, 2023, 1:50am UTC](https://ziggit.dev/t/zig-bindings-to-libcurl/1768/5 "2023-09-21T01:50:05Z")

</div>

Another option might be to use one of the wasmer builds [curl/curl: Curl is a command-line tool for transferring data specified with URL syntax](https://wasmer.io/curl/curl),  
and then use some wasm runtime to run it, either one written in zig or c.  
As anyone played around with something like this?

Would be interesting to see some comparisons between wasm and native, code size, memory and cpu time.  
I also wonder whether the wasmer curl build is a full curl, or maybe a somewhat simplified version,  
I guess I will investigate eventually, but I am currently busy with other things.

---

<div class="post-metadata">

**Author:** ![jiacai2050](https://ziggit.dev/user_avatar/ziggit.dev/jiacai2050/32/3657_2.png) [@jiacai2050](https://ziggit.dev/u/jiacai2050)\
**Post date:** [September 23, 2023, 2:00am UTC](https://ziggit.dev/t/zig-bindings-to-libcurl/1768/6 "2023-09-23T02:00:14Z")

</div>

Thanks for the links, I create [an issue](https://github.com/jiacai2050/zig-curl/issues/3) to track this.

---

<div class="post-metadata">

**Author:** ![mattnite](https://ziggit.dev/user_avatar/ziggit.dev/mattnite/32/5666_2.png) [@mattnite](https://ziggit.dev/u/mattnite)\
**Post date:** [September 26, 2023, 5:44am UTC](https://ziggit.dev/t/zig-bindings-to-libcurl/1768/7 "2023-09-26T05:44:17Z")

</div>

While the bits are rotten, I had put together a static libcurl for gyro: [GitHub - mattnite/zig-libcurl: compile libcurl in your build.zig](https://github.com/mattnite/zig-libcurl). Feel free to port it to the official package manager for your own project.

---

<div class="post-metadata">

**Author:** ![Cloudef](https://ziggit.dev/user_avatar/ziggit.dev/cloudef/32/1370_2.png) [@Cloudef](https://ziggit.dev/u/Cloudef)\
**Post date:** [December 21, 2023, 6:59am UTC](https://ziggit.dev/t/zig-bindings-to-libcurl/1768/8 "2023-12-21T06:59:02Z")

</div>

Here’s a PR

> <https://github.com/jiacai2050/zig-curl/pull/4>
>
> \* Fix crash on easy.do() which does not pass the proper type to curl
> \* Fix comp…ile on latest zig
> \* Use standard optimize options in built.zig
> \* Fix typo in errors.zig
> \* Allow the use of certificates in std.crypto.Certificate.Bundle instead of default one
> \* Include builtin libcurl compiled against mbedTls, the use of std.crypto.Certificate.Bundle is required, or CURLOPT\_CAINFO should be used to point to cacert bundle.
