curl Tutorial




curl ( is an incredibly useful and powerful command-line tool and library. The latest version at the time of this writing is 7.68.0 released January 8, 2020. You can download it from and the source code is available at

It's primary purpose is transferring data over network protocols like HTTP and HTTPS. It supports a large number of other protocols including: FTP, FTPS, Gopher, HTTP, HTTPS, IMAP, IMAPS, LDAP, LDAPS, POP3, POP3S, RTMP, RTSP, SCP, SFTP, SMB, SMBS, SMTP, SMTPS, Telnet and TFTP. It also supports SSL/TLS encryption, cookies, authentication, and proxies.

You can use it as a command-line tool by calling curl or you can use it as a library inside C, C++, or other applications. We will look at several things in this tutorial including:

  • Basic curl usage for making HTTP requests
  • Downloading files
  • Compiling from source
  • Using curl in a C++ application

Install curl

Most Linux distributions come with curl already installed. If not, you can usually use the package manager for your distribution to easily install it. For example, in Ubuntu:

sudo apt install curl

In Windows, you can download the executable from or use the Windows Subsystem for Linux (WSL).

Mac users can use the Homebrew formula for curl.

To learn how to build from source, see the "Compiling curl from source" section below.

View curl documentation

You can view the manual page online at or by running:

man curl

You can also view the available flags and options with -h or --help:

curl --help

Basic usage

By default, curl will make an HTTP request and output the results to standard out (typically the terminal).

# Make an HTTP request and print out the response

Common curl options

When I use curl, there are a few options I find myself using frequently. For example:

  • Viewing verbose output to inspect HTTP headers
  • Saving the output to a file instead of printing to stdout
  • Ignoring SSL certificate errors and self-signed certificates

View verbose output

With the -v or --verbose, curl will output detailed information including the HTTP header information and SSL handshake steps.

curl -v

Save the output as a file

Use the -o or --output option to tell curl to save the output as a file instead of printing to standard out:

# Save output to `devdungeon.html`
curl --output devdungeon.html

There is another shortcut with a capital O -O. This option will save the file using the name of the file based on the URL. This is handy if you don't want to specify the name and just have it automatically choose the name. For example, this command will download the file and name it TcpNull-1.0.jar.

curl -O

Alternatively, but less recommended, you could use redirection to pipe the standard output to a file:

# Save output to `index.html`
curl > index.html

Ignore SSL certificate errors

You can ignore SSL certificate errors by using the -k or --insecure flags which is useful if you have a self-signed certificate.

# Ignore SSL certificate errors
curl -k

Compiling curl from source

Clone or download the source from or

git clone

For compiling, the main files are in the src/ directory. It comes with a CMakeLists.txt file if you want to use CMake. It also comes with a Makefile.

I am using Windows 10 and CMake for my build. If you are using Mac or Linux, CMake can output the appropriate type of build. You simply need to run cmake on the root directory with the CMakeLists.txt file.

cmake C:\path\to\curl\

It will output several files in whatever directory you are currently in. The primary file of interest is the CURL.sln file which is a Visual Studio solution.

Open the CURL.sln file with Visual Studio (the full Visual Studio, not VS Code). Choose whether you want to build the Debug or Release version and run Build Solution.

If you chose release mode, the .dll file will be located at curl\lib\Release\libcurl.dll. This is the file you will be linking against when you compile your application that uses curl.

C++ curl example

You will need the compiled libcurl.dll (e.g. curl\lib\Release\libcurl.dll) file from the previous build step and the .h files in the include directory curl/include/.

You can find many examples in C and C++ from the official curl website examples page.

Here is a simple example of making an HTTP request:

// main.cpp
// Adapted from
#include <iostream>
#include <curl/curl.h>

int main(void)
  CURL *curl;
  CURLcode result;


  curl = curl_easy_init();
  if (curl) {

    // Set URL
    curl_easy_setopt(curl, CURLOPT_URL, "");
    // If you want to set any more options, do it here, before making the request.

    // Perform the request which prints to stdout
    result = curl_easy_perform(curl);

    // Error check
    if (result != CURLE_OK) {
      std::cerr << "Error during curl request: " 
                << curl_easy_strerror(result) << std::endl;

  } else {
    std::cerr << "Error initializing curl." << std::endl;


  return 0;
# Compile with g++, linking to libcurl, specifying the include directory and the path to the library(dll)
g++ main.cpp -lcurl -Iinclude -Llib\Release\

This will create an a.exe file that will perform the HTTP request.

Note that you will need to specify the path to the DLL during compile/link time, but after you have the executable, you might need to move the DLL file. The libcurl.dll needs to be in a directory that is in your PATH or in the same directory as the executable.


After following this guide you should know how to install and use curl to perform common tasks like HTTP requests. You should also know how to compile curl from source and use it in a simple C or C++ application.