Linux의 ar 명령을 사용하여 정적 라이브러리를 만드는 방법

소프트웨어를 개발할 때 Linux의 ar 명령을 사용하여 함수 라이브러리를 만듭니다. 이 튜토리얼은 샘플 코드로 완성된 정적 라이브러리를 만들고 수정하고 프로그램에서 사용하는 방법을 보여줍니다.

ar 명령은 1971년부터 사용된 진정한 베테랑입니다. ar라는 이름은 도구의 원래 의도된 용도를 나타냅니다. 아카이브 파일을 생성하기 위해. 아카이브 파일은 다른 파일의 컨테이너 역할을 하는 단일 파일입니다. 때로는 다른 많은 파일의 경우. 아카이브에서 파일을 추가, 제거 또는 추출할 수 있습니다. 그런 유형의 기능을 찾는 사람들은 더 이상 ar로 향하지 않습니다. 그 역할은 tar와 같은 다른 유틸리티에 의해 인수되었습니다.

그러나 ar 명령은 여전히 ​​몇 가지 전문적인 용도로 사용됩니다. ar는 정적 라이브러리를 만드는 데 사용됩니다. 이들은 소프트웨어 개발에 사용됩니다. 그리고 ar는 데비안 리눅스 배포판과 우분투와 같은 파생 상품에서 사용되는 “.deb” 파일과 같은 패키지 파일을 만드는 데에도 사용됩니다.

정적 라이브러리를 만들고 수정하는 데 필요한 단계를 실행하고 프로그램에서 라이브러리를 사용하는 방법을 보여줍니다. 그러기 위해서는 정적 라이브러리가 충족해야 하는 요구 사항이 필요합니다. 이 라이브러리의 목적은 텍스트 문자열을 인코딩하고 인코딩된 텍스트를 디코딩하는 것입니다.

이것은 데모 목적을 위한 빠르고 더러운 해킹입니다. 가치 있는 모든 것에 이 암호화를 사용하지 마십시오. 세상에서 가장 간단하다 대체 암호, 여기서 A는 B가 되고 B는 C가 되는 식입니다.

cipher_encode() 및 cipher_decode() 함수

우리는 “library”라는 디렉토리에서 작업할 것이고 나중에 “test”라는 하위 디렉토리를 만들 것입니다.

이 디렉토리에는 두 개의 파일이 있습니다. cipher_encode.c라는 텍스트 파일에는 cipher_encode() 함수가 있습니다.

void cipher_encode(char *text)
{
 for (int i=0; text[i] != 0x0; i++) {
   text[i]++;
 }

} // end of cipher_encode

해당 cipher_decode() 함수는 cipher_decode.c라는 텍스트 파일에 있습니다.

void cipher_decode(char *text)
{
 for (int i=0; text[i] != 0x0; i++) {
   text[i]--;
 }

} // end of cipher_decode

프로그래밍 지침이 포함된 파일을 소스 코드 파일이라고 합니다. libcipher.a라는 라이브러리 파일을 만들 것입니다. 여기에는 이 두 소스 코드 파일의 컴파일된 버전이 포함됩니다. libcipher.h라는 짧은 텍스트 파일도 생성합니다. 이것은 우리의 새 라이브러리에 있는 두 함수의 정의를 포함하는 헤더 파일입니다.

라이브러리와 헤더 파일이 있는 사람은 누구나 자신의 프로그램에서 두 가지 기능을 사용할 수 있습니다. 그들은 바퀴를 다시 발명하고 기능을 다시 작성할 필요가 없습니다. 그들은 단순히 우리 도서관의 사본을 사용합니다.

  'Animal Crossing: New Horizons'에서 맞춤형 디자인 키오스크를 사용하는 방법

cipher_encode.c 및 cipher_decode.c 파일 컴파일

소스 코드 파일을 컴파일하기 위해 우리는 gcc를 사용할 것입니다. 표준 GNU 컴파일러. -c(컴파일, 링크 없음) 옵션은 gcc에게 파일을 컴파일한 다음 중지하도록 지시합니다. 오브젝트 파일이라고 하는 각 소스 코드 파일에서 중간 파일을 생성합니다. gcc 링커는 일반적으로 모든 개체 파일을 가져와 함께 연결하여 실행 가능한 프로그램을 만듭니다. -c 옵션을 사용하여 해당 단계를 건너뜁니다. 객체 파일만 있으면 됩니다.

우리가 생각하는 파일이 있는지 확인합시다.

ls -l

두 개의 소스 코드 파일이 이 디렉토리에 있습니다. gcc를 사용하여 오브젝트 파일로 컴파일해 보겠습니다.

gcc -c cipher_encode.c
gcc -c cipher_decode.c

모든 것이 잘되면 gcc에서 출력이 없어야합니다.

이것은 소스 코드 파일과 이름이 같지만 확장자가 “.o”인 두 개의 개체 파일을 생성합니다. 라이브러리 파일에 추가해야 하는 파일입니다.

ls -l

libcipher.a 라이브러리 만들기

실제로 아카이브 파일인 라이브러리 파일을 생성하기 위해 ar를 사용할 것입니다.

-c(만들기) 옵션을 사용하여 라이브러리 파일을 만들고 -r(바꾸기 추가) 옵션을 사용하여 파일을 라이브러리 파일에 추가하고 -s(색인) 옵션을 사용하여 내부 파일의 인덱스를 만듭니다. 라이브러리 파일.

라이브러리 파일을 libcipher.a라고 부를 것입니다. 라이브러리에 추가할 개체 파일의 이름과 함께 명령줄에 해당 이름을 제공합니다.

ar -crs libcipher.a cipher_encode.o cipher_decode.o

디렉토리에 있는 파일을 나열하면 이제 libcipher.a 파일이 있는 것을 볼 수 있습니다.

ls -l

ar와 함께 -t(테이블) 옵션을 사용하면 라이브러리 파일 내부의 모듈을 볼 수 있습니다.

ar -t libcipher.a

libcipher.h 헤더 파일 생성

libcipher.h 파일은 libcipher.a 라이브러리를 사용하는 모든 프로그램에 포함됩니다. libcipher.h 파일에는 라이브러리에 있는 함수의 정의가 포함되어야 합니다.

헤더 파일을 생성하려면 gedit와 같은 텍스트 편집기에 함수 정의를 입력해야 합니다. 파일 이름을 “libcipher.h”로 지정하고 libcipher.a 파일과 동일한 디렉토리에 저장합니다.

void cipher_encode(char *text);
void cipher_decode(char *text);

libcipher 라이브러리 사용

우리의 새 라이브러리를 테스트하는 유일한 확실한 방법은 그것을 사용할 작은 프로그램을 작성하는 것입니다. 먼저 test라는 디렉토리를 만듭니다.

mkdir test

라이브러리와 헤더 파일을 새 디렉토리에 복사합니다.

cp libcipher.* ./test

새 디렉토리로 변경하겠습니다.

cd test

두 개의 파일이 여기에 있는지 확인합시다.

ls -l

라이브러리를 사용할 수 있는 작은 프로그램을 만들고 예상대로 작동하는지 증명해야 합니다. 다음 텍스트 줄을 편집기에 입력합니다. 편집기의 내용을 테스트 디렉토리의 “test.c”라는 파일에 저장합니다.

#include 
#include 

#include "libcipher.h"

int main(int argc, char *argv[])
{
 char text[]="How-To Geek loves Linux";

 puts(text);

 cipher_encode(text);
 puts(text);

 cipher_decode(text);
 puts(text);

 exit (0);

} // end of main

프로그램 흐름은 매우 간단합니다.

라이브러리 함수 정의를 볼 수 있도록 libcipher.h 파일이 포함되어 있습니다.
“text”라는 문자열을 만들고 “How-To Geek 사랑 Linux”라는 단어를 저장합니다.
그 문자열을 화면에 출력합니다.
cipher_encode() 함수를 호출하여 문자열을 인코딩하고 인코딩된 문자열을 화면에 인쇄합니다.
cipher_decode()를 호출하여 문자열을 디코딩하고 디코딩된 문자열을 화면에 인쇄합니다.

  iPhone에서 Apple 번역 앱을 사용하는 방법

테스트 프로그램을 생성하려면 test.c 프로그램을 컴파일하고 라이브러리에 링크해야 합니다. -o(출력) 옵션은 gcc가 생성한 실행 프로그램을 호출할 대상을 알려줍니다.

gcc test.c libcipher.a -o test

gcc가 자동으로 명령 프롬프트로 돌아가면 모든 것이 정상입니다. 이제 프로그램을 테스트해 보겠습니다. 진실의 순간:

./test

그리고 우리는 예상 출력을 봅니다. 테스트 프로그램은 일반 텍스트를 인쇄하고 암호화된 텍스트를 인쇄한 다음 해독된 텍스트를 인쇄합니다. 그것은 우리의 새 라이브러리 내에서 기능을 사용하고 있습니다. 우리 도서관이 작동합니다.

성공. 근데 왜 거기서 멈춰?

라이브러리에 다른 모듈 추가

라이브러리에 다른 기능을 추가해 보겠습니다. 프로그래머가 사용 중인 라이브러리 버전을 표시하는 데 사용할 수 있는 함수를 추가합니다. 새 함수를 만들고 컴파일하고 새 개체 파일을 기존 라이브러리 파일에 추가해야 합니다.

편집기에 다음 줄을 입력합니다. 편집기의 내용을 라이브러리 디렉토리의 cipher_version.c라는 파일에 저장합니다.

#include 

void cipher_version(void)
{
 puts("How-To Geek :: VERY INSECURE Cipher Library");
 puts("Version 0.0.1 Alphan");

} // end of cipher_version

libcipher.h 헤더 파일에 새 함수의 정의를 추가해야 합니다. 다음과 같이 보이도록 해당 파일의 맨 아래에 새 줄을 추가합니다.

void cipher_encode(char *text);
void cipher_decode(char *text);
void cipher_version(void);

수정된 libcipher.h 파일을 저장합니다.

cipher_version.o 개체 파일을 갖도록 cipher_version.c 파일을 컴파일해야 합니다.

gcc -c cipher_version.c

이렇게 하면 cipher_version.o 파일이 생성됩니다. 다음 명령을 사용하여 libcipher.a 라이브러리에 새 개체 파일을 추가할 수 있습니다. -v(verbose) 옵션은 일반적으로 무음 ar가 수행한 작업을 알려줍니다.

ar -rsv libcipher.a cipher_version.o

새 개체 파일이 라이브러리 파일에 추가됩니다. ar는 확인을 출력합니다. “a”는 “추가”를 의미합니다.

-t(테이블) 옵션을 사용하여 라이브러리 파일 내부에 어떤 모듈이 있는지 확인할 수 있습니다.

ar -t libcipher.a

이제 라이브러리 파일 안에 세 개의 모듈이 있습니다. 새로운 기능을 이용해보자.

cipher_version() 함수 사용.

테스트 디렉토리에서 이전 라이브러리와 헤더 파일을 제거하고 새 파일을 복사한 다음 테스트 디렉토리로 다시 변경해 보겠습니다.

파일의 이전 버전을 삭제합니다.

rm ./test/libcipher.*

새 버전을 테스트 디렉토리에 복사합니다.

cp libcipher.* ./test

테스트 디렉토리로 변경하겠습니다.

cd test

이제 새로운 라이브러리 기능을 사용하도록 test.c 프로그램을 수정할 수 있습니다.

cipher_version() 함수를 호출하는 test.c 프로그램에 새 줄을 추가해야 합니다. 우리는 이것을 첫 번째 puts(text); 라인.

#include 
#include  

#include "libcipher.h" 

int main(int argc, char *argv[]) 
{
 char text[]="How-To Geek loves Linux"; 

 // new line added here
 cipher_version(); 

 puts(text); 
 
 cipher_encode(text); 
 puts(text); 
 
 cipher_decode(text); 
 puts(text); 

 exit (0); 

} // end of main

이것을 test.c로 저장합니다. 이제 컴파일하고 새 기능이 작동하는지 테스트할 수 있습니다.

gcc test.c libcipher.a -o test

새 버전의 테스트를 실행해 보겠습니다.

  2014년 최고의 팁 및 튜토리얼 58가지

새로운 기능이 작동 중입니다. 테스트 출력 시작 부분에서 라이브러리 버전을 볼 수 있습니다.

하지만 문제가 있을 수 있습니다.

라이브러리에서 모듈 교체

이것은 라이브러리의 첫 번째 버전이 아닙니다. 두 번째입니다. 버전 번호가 잘못되었습니다. 첫 번째 버전에는 cipher_version() 함수가 없었습니다. 이것은 않습니다. 따라서 이것은 “0.0.2” 버전이어야 합니다. 라이브러리의 cipher_version() 함수를 수정된 함수로 교체해야 합니다.

고맙게도 ar를 사용하면 이를 매우 쉽게 수행할 수 있습니다.

먼저 라이브러리 디렉토리에 있는 cipher_version.c 파일을 수정해 보겠습니다. “버전 0.0.1 알파” 텍스트를 “버전 0.0.2 알파”로 변경합니다. 다음과 같이 표시되어야 합니다.

#include 

void cipher_version(void)
{
 puts("How-To Geek :: VERY INSECURE Cipher Library");  
 puts("Version 0.0.2 Alphan"); 

} // end of cipher_version

이 파일을 저장합니다. 새로운 cipher_version.o 개체 파일을 생성하려면 다시 컴파일해야 합니다.

gcc -c cipher_version.c

이제 라이브러리에 있는 기존 cipher_version.o 개체를 새로 컴파일된 버전으로 교체합니다.

라이브러리에 새 모듈을 추가하기 위해 이전에 -r(교체로 추가) 옵션을 사용한 적이 있습니다. 라이브러리에 이미 존재하는 모듈과 함께 사용할 때 ar는 이전 버전을 새 버전으로 교체합니다. -s(인덱스) 옵션은 라이브러리 인덱스를 업데이트하고 -v(자세한 정보) 옵션은 ar가 수행한 작업을 알려줍니다.

ar -rsv libcipher.a cipher_version.o

이번에 ar는 cipher_version.o 모듈을 교체했다고 보고합니다. “r”은 대체됨을 의미합니다.

업데이트된 cipher_version() 함수 사용

수정된 라이브러리를 사용하고 작동하는지 확인해야 합니다.

라이브러리 파일을 테스트 디렉토리에 복사합니다.

cp libcipher.* ./test

테스트 디렉토리로 변경하겠습니다.

cd ./test

새 라이브러리로 테스트 프로그램을 다시 컴파일해야 합니다.

gcc test.c libcipher.a -o test

이제 프로그램을 테스트할 수 있습니다.

./test

테스트 프로그램의 출력은 우리가 예상한 것입니다. 버전 문자열에 올바른 버전 번호가 표시되고 암호화 및 암호 해독 루틴이 작동 중입니다.

라이브러리에서 모듈 삭제

그러고 보니 부끄럽지만 라이브러리 파일에서 cipher_version.o 파일을 삭제해 봅시다.

이를 위해 -d(삭제) 옵션을 사용합니다. 또한 -v(verbose) 옵션을 사용하여 ar가 수행한 작업을 알려줍니다. 또한 -s(색인) 옵션을 포함하여 라이브러리 파일의 색인을 업데이트합니다.

ar -dsv libcipher.a cipher_version.o

ar는 모듈을 제거했다고 보고합니다. “d”는 “삭제됨”을 의미합니다.

라이브러리 파일 내의 모듈을 나열하도록 ar에 요청하면 두 개의 모듈로 되돌아간 것을 볼 수 있습니다.

ar -t libcipher.a

라이브러리에서 모듈을 삭제하려면 라이브러리 헤더 파일에서 해당 정의를 제거해야 합니다.

코드 공유

라이브러리는 실용적이면서도 사적인 방식으로 코드를 공유할 수 있도록 합니다. 라이브러리 파일과 헤더 파일을 제공한 사람은 누구나 라이브러리를 사용할 수 있지만 실제 소스 코드는 비공개로 유지됩니다.