C언어 C++ Programming

[C언어] 라이브러리 만들기, 읽기(dll, lib, 외부 코드, library import, 추가)

끄적끄적아무거나 2023. 7. 14. 08:00
반응형

 

목차

     

     

     

     

     

    [C언어] 라이브러리 dll, lib 이란?

     

    DLL과 LIB는 동적 링크 라이브러리와 정적 링크 라이브러리(Library)를 나타내는 파일 형식입니다. 아래 예제와 함께 각각의 역할과 사용법을 설명하겠습니다.

     

     

     

    DLL (Dynamic Link Library)

     

    DLL은 동적 링크 라이브러리(Dynamic Link Library)의 약자입니다. DLL은 여러 프로그램에서 공유할 수 있는 함수, 데이터, 리소스 등의 코드를 포함하는 파일입니다. 다른 프로그램에서 이러한 기능을 필요로 할 때 DLL을 로드하여 사용할 수 있습니다. DLL은 실행 파일이 로드될 때 메모리에 동적으로 링크되어 사용됩니다.

     

     

     

     

    LIB (Static Library)

     

    LIB는 정적 링크 라이브러리(Static Library)의 약자입니다. LIB 파일은 컴파일된 코드와 해당 코드를 사용하는 함수, 데이터, 리소스 등을 포함하는 파일입니다. LIB 파일은 링커에 의해 실행 파일과 함께 링크되어 컴파일 시점에 실행 파일에 포함됩니다.

     

     

     

     

    제가 생각하는 라이브러리는 그냥 간단하게 c파일과 헤더파일로 도서관을 만들었다고 생각합니다. 해당 도서관에는 여러 함수들이 들어갈 수 있습니다. 컴파일(Compile)은 이러한 함수들과 헤더들을 dll 이나 lib 라이브러리에서 가져와서 main 함수와 연결해주는 것이라고 생각합니다. 

     

     

    이제 예를 통해 쉽게 이해해보겠습니다. 참고로 제가 사용하는 IDE는 윈도우 환경에서 Visual Studio를 사용합니다. 

     

     

     

     

     

     

    [C언어] dll, lib 생성하기(Create)

     

    예제 코드>>

    #include <stdio.h>
    
    void printHelloWorld() {
        printf("Hello, world!\n");
    }

     

    위와 같이 hello world를 출력하는 함수를 만들고 컴파일을 하면 아래와 같은 에러메세지가 나옵니다.

     

     

    에러메세지>>

    1>Project6.c
    1>MSVCRTD.lib(exe_main.obj) : error LNK2019: unresolved external symbol main referenced in function "int __cdecl invoke_main(void)" (?invoke_main@@YAHXZ)
    1>C:\Users\forgo\source\repos\Project6\x64\Debug\Project6.exe : fatal error LNK1120: 1 unresolved externals
    1>Done building project "Project6.vcxproj" -- FAILED.

     

     

    이유는 main 함수가 없기 때문입니다. 저는 이 프로젝트를 사용해서 개인적인 라이브러리를 만들어 보겠습니다.

     

     

     

     

     

    위 그림과 같이 프로젝트 설정에서 exe 파일이 아닌 dll과 lib 형태의 라이브러리를 만들어 줍니다. dll을 만들어 보겠습니다.

     

     

    Build started...
    1>------ Build started: Project: Project6, Configuration: Debug x64 ------
    1>Project6.c
    1>Project6.vcxproj -> C:\Users\forgo\source\repos\Project6\x64\Debug\Project6.dll
    ========== Build: 1 succeeded, 0 failed, 0 up-to-date, 0 skipped ==========
    ========== Build started at 4:33 PM and took 00.777 seconds ==========

    정상적으로 빌딩이 되었습니다.

     

     

    이번에는 앞서 설정에서 dll을 lib으로 변경하고 lib 라이브러리를 만들어 보겠습니다. 

     

    잘만들어 졌군요....

     

     

     

     

    [C언어] lib, dll 읽어서 사용하기(Load, Read)

     

    이번에는 아래와 같이 main 함수만 있는 프로젝트를 만들어보겠습니다. 

     

    int main() {
        printHelloWorld();
        return 0;
    }

     

     

    그냥 실행시키면 당연히 아래와 같이 link 에러 메세지가 발생합니다. 

     

    Severity	Code	Description	Project	File	Line	Suppression State
    Error	LNK1120	1 unresolved externals	Project7	C:\Users\forgo\source\repos\Project6\x64\Debug\Project7.exe	1	
    Severity	Code	Description	Project	File	Line	Suppression State
    Error	LNK2019	unresolved external symbol printHelloWorld referenced in function main	Project7	C:\Users\forgo\source\repos\Project6\Project7\Project7.obj	1

     

    이유는 printHelloWorld() 함수가 정의되지 않았기 때문입니다.

     

     

    앞서 만든 라이브러리를 추가해서 실행해보겠습니다. 

     

     

     

    그림처럼 Additional Dependecies에서 앞서 만든 lib를 추가해줍니다. 

     

     

     

     

    그리고 위와 같이 lib가 있는 경로도 추가해줍니다. 

     

     

    위 그림과 같이 Debugging에서 dll의 경로를 추가해줍니다. 주의할 점은 Configuration을 설정에 따라 변경하셔야 합니다. 저는 지금 Debug 모드로 사용하기 때문에 Debug 설정을 하였습니다. 

     

     

     

     

    그리고 다시 컴파일을 해봅시다. 

     

    1>Project7.c
    1>C:\Users\forgo\source\repos\Project6\Project7\Project7.c(2,5): warning C4013: 'printHelloWorld' undefined; assuming extern returning int
    1>Project7.vcxproj -> C:\Users\forgo\source\repos\Project6\x64\Debug\Project7.exe
    1>Done building project "Project7.vcxproj".
    ========== Rebuild All: 1 succeeded, 0 failed, 0 skipped ==========
    ========== Rebuild started at 4:43 PM and took 00.748 seconds ==========

     

     

    빌딩이 성공했습니다. 

     

     

    결과>>

    C:\Users\forgo\source\repos\Project6\x64\Debug>Project7.exe
    Hello, world!

    잘 돌아갑니다~!!

     

     

     

    반응형