[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"로 설정해야합니다.
댓글
댓글 쓰기