[C, macOS] 상대경로 공유라이브러리

공유라이브러리는 자주 쓰는 함수들을 바이너리 형태로 만들어 두고, 필요할 때 불러서 쓸 수 있도록 합니다. c에서 공유라이브러리를 상대경로로 컴파일하지 않으면, 프로그램을 옮길때마다 일일히 라이브러리경로를 설정해줘야 하는 불편함이 있습니다. 오늘은 상대경로의 공유라이브러리 만드는 법을 알아보도록 합니다. 예시코드는 다음과 같습니다.

1. foo.c
#include <stdio.h>

void foo(void)
{
    puts("Hello, I'm a shared library");
}

2. foo.h
#ifndef foo_h__
#define foo_h__

extern void foo(void);

#endif  // foo_h__

3. main.c
#include <stdio.h>
#include "foo.h"

int main(void)
{
    puts("This is a shared library test...");
    foo();
    return 0;
}

foo 함수는 텍스트를 출력하는 함수이고, 메인함수는 foo 함수를 불러오는 테스트 코드입니다.  컴파일 환경은 gcc이고 macOS에서 컴파일하였습니다. 순서는 다음과 같습니다.
1. 오브젝트 파일 만들기
$ gcc -c foo.c

2. 공유라이브러리 컴파일하기
$ gcc -dynamiclib -install_name '@rpath/libfoo.dylib' foo.o -o libfoo.dylib

3. 메인함수 컴파일하기
$ gcc -L/Users/leejijin/Desktop -Wl,-rpath,'@executable_path' -o test main.c -lfoo

-L 뒤에는 컴파일 할 라이브러리의 경로를 명시합니다. 그리고 상대경로를 설정해주기 위해서 공유라이브러리를 생성할 때, "rpath" 위치에서 시작한다는 것을 설정에 넣어주고 메인함수를 컴파일 할 때에는 "rpath"를 "executable_path"로 설정해야합니다.


댓글

이 블로그의 인기 게시물

[Linux, AIX] 사용자 계정 생성 및 설정

[AIX] rpm 설치와 rpm 으로 패키지 설치 및 삭제

Ubuntu 에서 Fortran 시작하기