MinGW 정적 동적 라이브러리

2023. 4. 19. 19:09프로그래밍

728x90

 

 

MinGW Static and Dynamic Libraries

A simple introduction to static and dynamic libraries with GCC.

www.codeproject.com

 

소개

이 문서는 MinGW(Minimal GNU for Windows) 컴파일러를 사용하여 자신만의 라이브러리를 컴파일하는 방법에 대한 간략하고 간단한 소개를 제공하기 위한 글입니다. 이 기사에서는 C 언어에 대한 기본적인 이해가 있다고 가정합니다. 가장 먼저 해야 할 일은 MinGW를 다운로드하는 것입니다.

나는 Windows 환경 경로를 MinGW 디렉토리로 설정하는 것을 강력히 추천 드립니다.

이렇게 설정하면, 컴퓨터의 모든 디렉터리에서 MinGW GCC 컴파일러를 호출할 수 있습니다.

 

Windows 7에서는 마우스 오른쪽 버튼으로 내 컴퓨터->속성->고급->환경 변수 순으로 선택 클릭하고 MinGW 디렉토리를 PATH에 추가하거나 cmd.exe에 다음을 입력하면 됩니다:

>SET PATH=%PATH%;C:\MinGW\bin
 

SET 명령은 명령 프롬프트 세션이 실행 되는 동안 환경 변수를 임시로 설정 해 줍니다.

환경 변수를 영구적으로 변경하기를 원한다면 SET 대신 SETx 명령을 사용하십시오.

 

정적 라이브러리

다음 코드는 정적 및 동적 라이브러리를 만드는 데 사용되었습니다.

#include "add.h"
int add(int a, int b) {
    return a + b;
}
 
#ifndef ADD_H
#define ADD_H
int add(int a, int b);
#endif  // ADD_H
 

그냥 간단한 수학 라이브러리를 보여주는 예입니다. 메인 파일은 컴파일된 후 라이브러리 파일을 호출하는 방법을 보여줍니다.

정적 라이브러리를 실행하려면 헤더 파일이나 외부 참조가 필요한 것에 주목해야 합니다.

대부분의 경우, 당신이 만약 라이브러리를 공유하려면 이것은 헤더 파일 형식 내에 존재해야 할 것입니다.

함수 선언은 링커를 위해서 필요합니다. 헤더 파일에 대한 액세스 권한이 없는 경우 라이브러리를 리버스 엔지니어링을 고려해서 함수 선언을 생성해야 할지도 모릅니다.

 

정적 라이브러리 컴파일

라이브러리 구축(빌드)

 

gcc 플래그들:

  • -c: 링커 호출을 비활성화.
  • -o: 사용자 정의 출력 파일.

 

ar 플래그들:

  • -r: 파일 멤버...를 아카이브에 삽입합니다(교체 포함).
  • -c: 아카이브 파일을 만들고 있음을 나타냅니다.
  • -s: 오브젝트 파일 인덱스를 아카이브에 기록하고 아카이브를 변경합니다.

 

중요한 점은 GCC 컴파일러에서는 정적 라이브러리 앞에 libadd.a와 같이 키워드 lib와 접미사 .a를 붙일 것을 요구한다는 점을 알아야 한다는 것입니다.

정적 라이브러리를 찾으려면 링커에서 lib 접두어가 필요합니다.

 

라이브러리 참조하기

>gcc -c main.c -o main.o
>gcc -c main.exe main.o -L. -ladd
>main.exe
 
 

gcc 플래그들:

 

  • -L: 참조하려는 라이브러리의 위치를 ​​나타냅니다(. = 현재 디렉터리).
  • -l: 연결할 특정 라이브러리를 지정합니다.

 

동적 라이브러리 컴파일

동적 라이브러리도 정확히 앞의 코드와 동일한 코드를 사용합니다.

대부분의 자습서에서는 __declspec(dllexport)를 사용해서 함수 참조를 내보낼 것을 제안합니다.

__declspec은 Microsoft 특정 한정자이므로 GCC에는 필요하지 않습니다.

둘째로, 많은 사람들이 동적 라이브러리를 DLL(동적 연결 라이브러리)로 생각합니다.

하지만 GNU는 이 동적 라이브러리를 so로 참조합니다(공유 객체-shared objects).

확장자 이름을 DLL로 공유 라이브러리를 지정할 수 있지만 GCC는 ELF(Executable Linkable Format)를 사용하고 Microsoft Linker는 오래 된 COFF(Common Object File Format)를 사용하므로 권장하지 않습니다.

공유 라이브러리의 이름을 so로 지정하면 Windows 전용 라이브러리가 아니라 GCC 공유 라이브러리임을 나타냅니다.

 

라이브러리 참조하기

 

gcc flags:

  • -shared 공유 라이브러리를 컴파일하고 싶다고 컴파일러에 알립니다.

main.c는 여전히 함수 참조를 얻기 위해서는 add.h의 헤더에 대한 액세스가 필요하다는 것을 기억하십시오.

그렇지 않으면 메인 파일에 외부 참조를 수동으로 입력해야 합니다.

 

정적과 동적 비교

가장 먼저 나의 눈에 띄는 것은 동적 실행 파일이 정적 실행 파일보다 크다는 것입니다.

이것은 동적 라이브러리가 동적 라이브러리를 참조하기 위한 오버헤드가 있다는 사실 때문입니다.

일반적으로 DLL에 거대한 함수 집합이 포함된 경우에는 그렇지 않을 것입니다. DLL에 하나의 함수만 있으면 동적 라이브러리의 오버헤드가 정적 라이브러리의 필요한 것보다 큽니다.

예제 이미지에서 DLL이 삭제되면 동적 실행 파일은 동적 라이브러리에 의존하므로 실행되지 않을 것입니다.

정적 라이브러리는 실행 파일로 직접 컴파일되기 때문에 외부 라이브러리 없이 실행됩니다.

 

동적(라이브러리)

장점

  • 여러 실행 파일이 DLL을 참조할 수 있음
  • 실행 파일은 일반적으로 더 작습니다.
  • 코드가 중앙 집중화되므로 업데이트가 더 쉬워집니다.
  • 대규모 프로젝트에 적합

단점

  • 외부 라이브러리가 필요합니다

 

정적 (라이브러리)

 

장점

  • 외부 라이브러리에 의존하지 않음
  • 소규모 프로젝트 또는 한 번만 작성하는 프로젝트에 적합

단점

실행 파일은 일반적으로 머신 코드가 파일 간에 복제되므로 더 큽니다.

 

결론

동적 및 정적 라이브러리는 모두 프로젝트 내에서 자신의 위치를 차지합니다.

적절한 작업을 위해서 적합한 라이브러리를 선택해야 한다는 것을 잊지 말아야 합니다.

라이브러리 유형에 관계없이 라이브러리에 포함된 기능을 실행하기위해서 당신은 여전히 헤더 파일이 필요할 것입니다.

나는 GCC를 사용하면 일반적으로 라이브러리를 생성하는 것이 더 쉽다는 것을 알게 되었습니다.

Windows 관련 *.lib 및 *.dll 라이브러리와 혼동되지 않도록 정적 라이브러리 *.a 및 공유 라이브러리 *.so 로 이름을 제대로 지정해야 하는 것을 기억 하십시오.

다음 기사에서는 Microsoft Visual C++에서 라이브러리를 생성하고 클래스를 사용하는 방법에 대해 설명 할 것입니다.

 

이상.

 

728x90