공유 라이브러리 작성시 문제 입니다.
글쓴이: mirinae312 / 작성시간: 화, 2008/02/19 - 10:32오전
안녕하세요.
공유라이브러리에 대해서 질문드립니다.
a.so 라는 라이브러리를 조금 수정해 서 b.so 라는 라이브러리를 만들었습니다.
그리고, manager.so 를만들어서 manager.so가 a.so, b.so 를 사용하도록 하였습니다.
(a.so 와 b.so의 외부 인터페이스 이름(외부에 공개되는 함수명)은 서로 다르게 해주었고요...)
그런데 문제가 생겼습니다.
a.so, b.so 의 외부 인터페이스 말고, 라이브러리 내부에서 쓰는 함수들의 이름이 같다보니, 함수 콜이 뒤죽박죽으로 일어나네요...
a.so내부에 f()가 있고, b.so 내부에 f()가 있다면 a.so의 f()를 호출해야 할 때, b.so의 f()를 호출하는 식으로요...
무엇이 잘못되고 해결 방법은 무었인지... 고수님들의 조언을 부탁드립니다.
Forums:
함수명에 프리픽스를 붙이세요.
오브젝트 내에서만 사용하는 함수라면 static으로 선언하면 되겠지만,
같은 라이브러리 내의 다른 오브젝트에서 참조하는 함수라면 static으로 선언하기도 어렵네요.
통상 그래서 라이브러리 함수들은
함수명앞에 prefix를 붙여 놓습니다.
서로 이름으로 충돌나지 않게 하기 위해서죠...
예를 들면 gdbm같은 경우,
gdbm_open ()
gdbm_close ()
gdbm_store ()
gdbm_fetch ()
...
이런 식으로 함수명 앞에 gdbm_ 를 붙여 놓지요...
그리고 오브젝트를 잘 정리하셔서 static과 extern 함수를 구분해놓으시면 보기에도 많이 편합니다.
manager쪽에서는
manager쪽에서는 어차피 외부에 드러난 것만 사용한다는 말같으니 f나 g같은건 그냥 윗분 말씀처럼 static으로 선언해주시면 될것같습니다..
위에서 말씀해주신
위에서 말씀해주신 것처럼, 함수 이름을 다르게 해서 해결할 수 있고,
다른 방법으로는 dlopen 등으로 동적으로 공유라이브러리를 열어서, 호출하는 것입니다. 물론 이 때에도 같은 심볼을 갖고 있는 공유 라이브러리끼리 링크돼 있으면 안됩니다. 일반적으로 플러그인 기능을 제공하는 소프트웨어들이 이 방법을 씁니다.
Orion Project : http://orionids.org
댓글 달기