개요
CURL 라이브러리는 URL 기반으로 데이터를 웹으로 전송하는 기능을 제공하는 라이브러리입니다. 웹으로 전송하기 위해 HTTP/TCP/IP 통신을 직접 구현할 수도 있지만, CURL 라이브러리를 사용하면 TCP/IP 소켓 제어 및 HTTP 통신을 직접 제어할 필요 없이 쉽게 수행할 수 있습니다.
CURL 라이브러리의 공식 웹사이트는 아래와 같습니다.
CURL 소스패키지 다운로드
CURL은 CURL 공식 웹사이트에서도 다운로드하여 사용할 수 있으나, 여기서는 arm-cross-sysroot를 이용해 빌드된 CURL 라이브러리를 사용합니다.
arm-cross-sysroot은 다양한 리눅스 라이브러리(CURL 라이브러리 포함)들을 ARM기반 플랫폼에서 동작할 수 있도록 크로스컴파일 할 수 있는 기능을 제공합니다.
1. 다음 명령으로 arm-cross-sysroot를 다운로드합니다.
$ sudo apt install wget
$ wget https://github.com/Illuminux/arm-cross-sysroot/archive/1.0.2.tar.gz
$ tar zxf 1.0.2.tar.gz
$ cd arm-cross-sysroot-1.0.2/
2. config.cfg 파일을 작성합니다.
arm-cross-sysroot 소스패키지 폴더 내에 config.cfg.sample 파일이 있으며, 이를 config.cfg 파일로 복사한 후 편집합니다.
아래 내용의 밑줄 친 부분과 같이 수정합니다. arm-cross-sysroot 소스패키지의 경로 및 툴 체인 경로는 개발 환경에 맞도록 수정합니다.
- UV_toolchain_dir은 실제 컴파일러 실행파일(gcc 등)이 들어 있는 bin 폴더의 상위폴더까지만 명시합니다. (예: /opt/gcc-4.6.2-glibc-2.13-linaro-multilib-2011.12/tq-linaro-toolchain)
- UV_board: 본 예시에서 타겟 플랫폼은 Hard-floating 연산을 지원하므로 “hardfloat“으로 명시하였습니다.
# The variable GV_base_dir is the directory in which the main script is located.
GV_base_dir=/workspace/arm-cross-sysroot-1.0.2
# Directory in which the sysroot should be installed
UV_sysroot_dir="${GV_base_dir}/output"
# Directory in which the downloads are to be loaded
UV_download_dir="${GV_base_dir}/download"
# Directory where the toolchain is located (exclude bin directory)
UV_toolchain_dir="/usr/"
# Target architecture
UV_target="arm-linux-gnueabihf"
# Target Board
# softfloat: Default soft float boarde
# hardfloat: Default hard float boarde
# raspi: Raspberry PI
# beaglebone: BeagleBone / Beglebone black
#
UV_board="hardfloat"
3. 다음 명령을 이용하여 빌드합니다.
참고로, 빌드하기 위해 개발머신에서 필요한 패키지는 arm-cross-sysroot 소스패키지 내의 README.md 파일에 명시되어 있으며, 개발 환경에 맞게 apt install 명령어 등을 이용하여 설치하면 됩니다.
$ apt install gettext pkg-config libtool intltool intltool autogen autoconf automake cmake libxml2-dev curl
$ ./sysroot --build
빌드가 시작되면, 소스패키지 내 download 및 output 폴더가 생성되며, download 폴더에는 각 라이브러리의 소스파일들이 다운로드 되고, output 폴더에는 각 라이브러리들의 빌드 결과물이 저장됩니다.
빌드 되는 라이브러리들 중 CURL에 관련된 라이브러리들은 다음과 같습니다.
- curl, ssl, ssh2, crypto, gcrypt, gpg-error, z
이 라이브러리들은 어플리케이션 빌드 및 실행 시에 필요합니다.
위 라이브러리 중 일부는 공유 라이브러리(.a 파일이 생성되지 않음)로 빌드 됩니다.
위 라이브러리들을 사용하는 어플리케이션 빌드 시에는 정적 라이브러리 옵션(-static)을 사용해서는 안 됩니다.
위 라이브러리들은 타겟 플랫폼의 라이브러리 폴더(/lib 또는 /usr/lib)에도 존재해야 해당 라이브러리를 포함한 어플리케이션이 실행될 수 있습니다.
빌드 중 에러 메시지 처리
빌드 중 특정 라이브러리의 소스패키지 파일을 다운로드할 수 없다는 에러가 발생할 수 있습니다.
이는 해당 라이브러리 소스패키지 파일을 다운로드할 수 있는 서버에 접속할 수 없다는 의미이며, 이런 경우에는 웹 검색엔진(구글)에서 소스패키지 파일명을 검색하여 직접 다운로드해서 download 폴더 안에 복사한 후 다시 빌드 합니다.
아래 내용은 한 예로 json-glib-0.14.2.tar.xz를 다운로드할 수 없다는 에러 메시지입니다.
...
curl: (7) Failed to connect to ftp.gnome.org port 21: Connection refused
Extract json-glib-0.14.2.tar.xz... /projects/essys_cloud/CURL/
arm-cross-sysroot-master/download/json-glib-0.14.2.tar.xz: No such file or directory
/projects/essys_cloud/CURL/arm-cross-sysroot-master/include/files.sh: line 97: [: 077c5a7bfabdaefba1f4472100e29add9aa910a4: unary operator expected
faild
json-glib: json-glib-0.14.2.tar.xz is not a valid archive!
*** Error in json-glib ***
아래는 직접 다운로드한 후 빌드했을 때의 메시지입니다. 빌드가 성공적으로 완료되고 다음 라이브러리 패키지의 빌드 절차로 넘어갔음을 알 수 있습니다.
...
Build json-glib:
Download json-glib-0.14.2.tar.xz... alredy loaded
Extract json-glib-0.14.2.tar.xz... donne
Configure json-glib... donne
Make json-glib... donne
Install json-glib... donne
Build libsoup:
Download libsoup-2.40.3.tar.xz...
...
최신 버전의 라이브러리 소스패키지 빌드
arm-cross-sysroot 패키지는 해당 버전의 패키지가 릴리즈 될 당시에 결정된 각 라이브러리 소스패키지의 버전으로 구성되어 있어, 각 라이브러리 별로 최신의 라이브러리 버전이 아닐 수 있습니다. 각 라이브러리에 대한 빌드 진행은 개략적으로 다음과 같이 진행됩니다.
- include/settings.cfg 파일 내에 빌드 할 라이브러리들의 명칭이 GV_build_formulas 변수로 명시되어 있으며, 해당 라이브러리들에 대해 빌드가 진행됨
GV_version="1.2.0"
GV_build_date="22.04.2015"
GV_host=$UV_target
GV_source_dir="${GV_base_dir}/src"
GV_log_dir="${GV_base_dir}/log"
GV_log_file="${GV_log_dir}/build.log"
GV_prefix="${UV_sysroot_dir}/${GV_host}"
GV_src_img_name="sources.sparseimage"
GV_src_img_size="20G"
declare -a GV_version
declare -a GV_url
GV_build_formulas=(
"zlib"
"bzip2"
"liblzma"
"libffi"
"expat"
"tslib"
"glib"
"dbus"
"gsl"
"ncurses"
"gmp"
"mpfr"
"readline"
"sqlite"
"cryptodev"
"openssl"
"libgpg-error"
"libgcrypt"
"libssh"
"curl"
"libconfig"
"libxml2"
"json-glib"
"libsoup"
"libevent"
"xorg-macros"
"xtrans"
"xproto"
"xextproto"
"inputproto"
"xcb-proto"
"pthread-stubs"
"libXau"
"libxslt"
"libxcb"
"xcb-util"
"xcb-util-wm"
"xcb-util-image"
"xcb-util-keysyms"
"videoproto"
"kbproto"
"libpng"
"jpeg"
"jasper"
"libtiff"
"lcms2"
"libraw"
"freetype"
"fontconfig"
"libX11"
"libXext"
"libXv"
"lame"
"alsa-lib"
"ogg"
"libvorbis"
"directfb"
"pixman"
"cairo"
"theora"
"x264"
"libav"
"gstreamer"
"libvisual"
"orc"
"gst-plugins-base"
"wavpack"
"taglib"
"gst-plugins-good"
"libical"
"bluez"
"libusb"
"libmodbus"
"i2c-tools"
"liblqr"
"qt-everywhere"
"qjson"
"blacklib"
"wiringpi"
"opencv"
)
export PATH="${UV_toolchain_dir}/bin:${GV_prefix}/bin:${UV_sysroot_dir}/bin:${PATH}"
export CFLAGS="-I${UV_sysroot_dir}/include"
export CPPFLAGS=$CFLAGS
export CXXFLAGS=$CPPFLAGS
export LDFLAGS="-L${UV_sysroot_dir}/lib"
export PKG_CONFIG_LIBDIR="${UV_sysroot_dir}/lib/pkgconfig"
export PKG_CONFIG_SYSROOT_DIR="${UV_sysroot_dir}"
export PKG_CONFIG_PATH="${UV_sysroot_dir}/lib/pkgconfig"
formula 폴더 안에는 각 라이브러리들에 대한 빌드 스크립트가 “라이브러리명.sh” 파일로 저장되어 있으며, 해당 스크립트에 따라 빌드가 진행됩니다.
라이브러리의 버전을 변경하고 싶으면 해당 라이브러리 빌드 스크립트 파일의 GV_url 변수와 GV_sha1 변수를 수정합니다.
- GV_url : 해당 라이브러리 소스패키지의 웹 다운로드 경로
- GV_sha1 : 해당 파일의 SHA1 Checksum 값
GV_sha1의 값은 임의로 알 수 없으므로, 해당 라이브러리 압축 파일을 웹에서 직접 다운로드하여 download 폴더에 복사한 후, “sha1sum” 유틸리티를 이용하여 해시 값을 획득한 후 해당 값을 적용합니다.
아래 그림은 기존 7.26.0 버전의 CURL 라이브러리를 7.51.0 버전으로 변경한 내용을 나타냅니다.
$ sha1sum curl-7.51.0.tar.bz2
f02a14bbe580d2a8cf3bf45a79d39eb595220ac7 curl-7.51.0.tar.bz2
$ vi curl.sh
#!/bin/bash
#GV_url="http://curl.haxx.se/download/curl-7.26.0.tar.bz2"
GV_url="http://curl.haxx.se/download/curl-7.51.0.tar.bz2"
#GV_sha1="c2e62eaace2407d377bf544d1f808aea6dddf64c"
GV_sha1="f02a14bbe580d2a8cf3bf45a79d39eb595220ac7"
GV_depend=(
"zlib"
"openssl"
"libssh"
)
FU_tools_get_names_from_url
FU_tools_installed "libcurl.pc"
if [ $? == 1 ]; then
FU_tools_check_depend
export LIBS="-lssh2 -lcrypto -lgcrypt -lgpg-error -lz -ldl"
GV_args=(
"--host=${GV_host}"
"--prefix=${GV_prefix}"
"--program-prefix=${UV_target}-"
"--libdir=${UV_sysroot_dir}/lib"
"--includedir=${UV_sysroot_dir}/include"
"--enable-shared"
"--disable-static"
"--enable-ipv6"
)
FU_file_get_download
FU_file_extract_tar
FU_build_configure
FU_build_make
FU_build_install "install-strip"
FU_build_finishinstall
fi
어플리케이션 빌드 및 실행
CURL 라이브러리를 포함하는 어플리케이션을 빌드하기 위해서는 arm-cross-sysroot-master에서 빌드 된 라이브러리들 중 다음 라이브러리들을 포함시켜야 합니다.
- curl, ssl, ssh2, crypto, gcrypt, gpg-error, z (*.a, *.so*, *.la 파일)
해당 라이브러리 파일들을 어플리케이션 소스패키지 특정폴더 내에 복사하고 어플리케이션 빌드 시 Makefile에 다음과 같이 명시하여 라이브러리를 링크하여 빌드하도록 합니다.
- LIBS += -L특정폴더 -lcurl –lssl –lssh2 –lcrypt –lgcrypt –lgpg-error –lz
위 라이브러리들 중 일부는 공유라이브러리 형식이므로, 어플리케이션을 타겟 플랫폼에서 실행시키기 위해 위 라이브러리(.so 파일)들을 모두 타겟 플랫폼의 라이브러리 폴더(/lib 또는 /usr/lib)에 다운로드해야 합니다.
- libcrypt.so*, libcurl.so*, libgcrypt.so*, libgpg-error.so*, libssh2.so*, libssl.so*, libz.so*
파트너스 활동을 통해 일정액의 수수료를 제공받을 수 있음
'프로그래밍 > 리눅스 프로그래밍' 카테고리의 다른 글
리눅스 타이머 프로그래밍 (0) | 2023.01.15 |
---|---|
리눅스 어플리케이션 반복 실행 테스트 방법 (1) | 2022.09.25 |
nanosleep() - 프로세스/쓰레드의 실행을 멈추는(재우는) 함수 (0) | 2022.04.20 |
Kernel PPS 신호 사용하기 (C source code) (0) | 2022.03.26 |
리눅스 TUN/TAP 디바이스 프로그래밍 (1) | 2021.01.28 |
프로세스 간 통신(IPC) 프로그래밍 - 메시지큐 (0) | 2021.01.19 |
GPSd를 이용한 GNSS 프로그래밍 (0) | 2020.12.24 |
리눅스 프로그래밍 - 프로세스 종료 신호(SIGINT, SIGTERM) 후킹하기 (0) | 2020.08.21 |