Advanced C++

[C++] libcurl (1) 다운로드 및 설치

로파이 2022. 4. 17. 17:53

libcurl 라이브러리
https://curl.se/libcurl/

 

libcurl - the multiprotocol file transfer library

libcurl - the multiprotocol file transfer library libcurl is a free and easy-to-use client-side URL transfer library, supporting DICT, FILE, FTP, FTPS, GOPHER, GOPHERS, HTTP, HTTPS, IMAP, IMAPS, LDAP, LDAPS, MQTT, POP3, POP3S, RTMP, RTMPS, RTSP, SCP, SFTP,

curl.se

다양한 프로토콜을 지원하는 파일(메시지) 전송 라이브러리이다.

C 언어로 작성되었으며 FTP, HTTP, HTTPS, IMAP, MQTT, POP3, SFTP 등 다양한 프로토콜을 지원한다.

다양한 OS에서 빌드 및 테스트된 바이너리 형태의 라이브러리로 제공한다.

주로 리눅스 OS에서 curl 명령어로 기능을 자주 사용하며 원하는 파일/ 메시지를 전송 할 수 있다.

 

libcurl 라이브러리를 래핑하여 편리하게 사용하는 소스도 많이 검색된다.


다운로드 및 설치
https://curl.se/download.html

해당 페이지에서 압축 파일을 받아서 압축을 풀어 projects 폴더내의 curl-all.sln 프로젝트 솔루션을 찾는다.


projects/Windows/VCXX 폴더들이 있는데 설치한 VisualStudio 버전에 따라 알맞은 툴 버전을 선택한다.

VS2022의 경우 VS17에 해당, VS2017/2019의 경우 VS15내의 솔루션을 선택한다.

 

솔루션에서 빌드 설정의 경우 Lib Debug - DLL Windows SSPI 를 선택하고 빌드한다. 해당 선택은 정적 라이브러리를 빌드하며 동적 라이브러리의 경우 DLL Debug - DLL Windows SSPI를 선택한다.

SSPI의 경우 HTTPS와 같은 SSL 인터넷 보안 프로토콜을 사용하는 경우 필요한 프로토콜 기능을 설치하기위해 필요하다.

 

curl 프로젝트의 경우 libcurl 라이브러리를 사용하는 tool_main.c에 해당하는 테스트 실행 파일(.exe)를 만들어내고
libcurl 프로젝트가 동적/정적 라이브러리를 만들어낸다. 


자신이 사용하는 프로젝트에서 libcurl을 사용할 경우 curl 프로젝트 구성 설정을 참고하여 설정하면 된다.

 

정적 라이브러리 링크
출력 라이브러리는 build/Win64(32)/VC17/($Configuration) 폴더내에 생성된다.

정적 라이브러리 파일

해당 파일들을 자신의 프로젝트의 라이브러리만 모은 특정 폴더내로 복사한 경로 혹은 해당 폴더 경로를 구성-링커-일반-추가 라이브러리 디렉터리로 추가한다.

프로젝트내에서 라이브러리만 모아 놓은 Library 경로에 파일들을 복사하였다.
링커 - 일반 - 추가 라이브러리 디렉터리

또한 libcurl 정적 라이브러리가 정적으로 참조하는 라이브러리를 추가해야한다. 윈도우 소켓이나 암호화 관련 라이브러리이다.
구성-링커-입력-추가 종속성에 다음을 추가한다.

ws2_32.lib
wldap32.lib
crypt32.lib
libcurld.lib

include 폴더 내에는 헤더 파일로 포함시켜야하는 파일들이 있다.

마찬가지로 자신의 프로젝트의 포함 디렉터리로 복사하거나 해당 경로를 구성-VC++ 디렉터리-포함 디렉터리 경로에 추가한다.

위 과정이 일반적인 정적 라이브러리를 링크하는 방법이다.
추가적으로 libcurl 정적 라이브러리를 사용하는 경우 전처리기에 CURL_STATICLIB 정의를 추가해야한다.

이를 추가하지 않으면 정적 라이브러리의 경우 링크 에러가 발생한다.
동적 라이브러리의 경우 출력 라이브러리 중 libcurl.dll을 실행 파일 경로에 복사해야 한다.

 

이제 관련 헤더를 포함시키고 함수를 사용하면 링크 에러없이 컴파일되어야한다.
HTTP GET 예제 - https://curl.se/libcurl/c/https.html
curl_define.h

#pragma once
#ifndef _CURL_DEFINE_
#define _CURL_DEFINE_

#include <cstdio>
#include <curl/curl.h>
#include <curl/curlver.h>
#include <curl/easy.h>
#include <curl/urlapi.h>

#endif // !_CURL_DEFINE_

main.cpp

#include <stdio.h>
#include "curl_define.h"

int main(void)
{
    CURL* curl;
    CURLcode res;

    curl_global_init(CURL_GLOBAL_DEFAULT);

    curl = curl_easy_init();
    if (curl) {
        curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/");

#ifdef SKIP_PEER_VERIFICATION
        /*
         * If you want to connect to a site who is not using a certificate that is
         * signed by one of the certs in the CA bundle you have, you can skip the
         * verification of the server's certificate. This makes the connection
         * A LOT LESS SECURE.
         *
         * If you have a CA cert for the server stored someplace else than in the
         * default bundle, then the CURLOPT_CAPATH option might come handy for
         * you.
         */
        curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L);
#endif

#ifdef SKIP_HOSTNAME_VERIFICATION
        /*
         * If the site you are connecting to uses a different host name that what
         * they have mentioned in their server certificate's commonName (or
         * subjectAltName) fields, libcurl will refuse to connect. You can skip
         * this check, but this will make the connection less secure.
         */
        curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0L);
#endif

        /* Perform the request, res will get the return code */
        res = curl_easy_perform(curl);
        /* Check for errors */
        if (res != CURLE_OK)
            fprintf(stderr, "curl_easy_perform() failed: %s\n",
                curl_easy_strerror(res));

        /* always cleanup */
        curl_easy_cleanup(curl);
    }

    curl_global_cleanup();

    return 0;
}