공유 라이브러리 작성시 문제 입니다.

mirinae312의 이미지

안녕하세요.
공유라이브러리에 대해서 질문드립니다.

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()를 호출하는 식으로요...

무엇이 잘못되고 해결 방법은 무었인지... 고수님들의 조언을 부탁드립니다.

panda005의 이미지

오브젝트 내에서만 사용하는 함수라면 static으로 선언하면 되겠지만,
같은 라이브러리 내의 다른 오브젝트에서 참조하는 함수라면 static으로 선언하기도 어렵네요.

통상 그래서 라이브러리 함수들은
함수명앞에 prefix를 붙여 놓습니다.
서로 이름으로 충돌나지 않게 하기 위해서죠...
예를 들면 gdbm같은 경우,
gdbm_open ()
gdbm_close ()
gdbm_store ()
gdbm_fetch ()
...
이런 식으로 함수명 앞에 gdbm_ 를 붙여 놓지요...

그리고 오브젝트를 잘 정리하셔서 static과 extern 함수를 구분해놓으시면 보기에도 많이 편합니다.

rapzzard의 이미지

manager쪽에서는 어차피 외부에 드러난 것만 사용한다는 말같으니 f나 g같은건 그냥 윗분 말씀처럼 static으로 선언해주시면 될것같습니다..

체스맨의 이미지

위에서 말씀해주신 것처럼, 함수 이름을 다르게 해서 해결할 수 있고,

다른 방법으로는 dlopen 등으로 동적으로 공유라이브러리를 열어서, 호출하는 것입니다. 물론 이 때에도 같은 심볼을 갖고 있는 공유 라이브러리끼리 링크돼 있으면 안됩니다. 일반적으로 플러그인 기능을 제공하는 소프트웨어들이 이 방법을 씁니다.

Orion Project : http://orionids.org

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.