libpthread.a와 libpthread.so가 다른가요...

MythRab의 이미지

동적으로 libpthread.so를 링크시켰을 때는 프로그램이 잘 돌아가더니,
libpthread.a로 바꾸니까 에러가 나네요.

에러는
undefined reference to 'pthread_create',
undefined reference to 'pthread_join'
이렇게 납니다.

물론 pthread.h는 include 했구요.

둘다 pthread.h에 정의 되어 있는 건데 왜 이렇게 나오는지 모르겠네요.
다른 pthread 함수들도 사용하는데 왜 두 함수만 이러는지... ㅡㅡ

먼가 짚이는게 있는 분들의 도움을 청합니다.

ironiris의 이미지

.so 는 동적라이브러리
.a 는 정적라이브러리입니다.
컴파일시 .a 와 링크되었다면 이 파일이 없어도 혼자서 잘돌아가며 .so 와 링크되었으면 이 파일이 있어야만 실행됩니다.
.a 와 링크하면 실행파일에 .a의 내용이 포함되기 때문에 크기가 상대적으로 더 키지죠.

MythRab의 이미지

위에 말씀하신 내용을 알고 있고요.
혹시 무언가 다른차이점이 있기 때문에 pthread_create, pthread_join을 인식못하는 것이지가 궁금합니다.

차이점이 없다면 짚이는 부분이라도 말씀해주시길...

Heading, heading again, again, ... ㅜㅜ 피난다

sangwoo의 이미지

실행파일을 한번 nm으로 살펴보세요. 심볼이 이상없이 들어 있는지..
그리고 컴파일을 어떻게 하셨는지도 올려주시면 문제해결에 도움이 될 것 같습니다.

----
Let's shut up and code.

pynoos의 이미지

-lpthread 대신 /usr/lib/libpthread.a 라고 넣으셨나요?

MythRab의 이미지

/usr/lib/libpthread.a라고 적었습니다.

그런데 정적으로 링크가 안된 것 같습니다.
/usr/lib/libpthread.a를 빼고 컴파일 해도 똑같은 에러가 나내요.

이렇게 바꿔주면 되는거 아닌가요... :?
왜 안되는지...

Heading, heading again, again, ... ㅜㅜ 피난다

progcom의 이미지

-static 옵션을 넣어줘보세요 :)

pynoos의 이미지

모든 .o 파일을 nm 으로 조사하여 어떤 놈이 문제의pthread_create와 pthread_join 를 사용하는지 조사합니다. " U "로 나오겠지요.

그 놈들 뒤에 라이브러리를 두어야하는 것 잊지 마시고.. 확인해보세요.

MythRab의 이미지

너무 오래됬지만...

다른 일이 겹쳐서 일단 동적으로 하기로하고 지나가고 까먹었는데 드디어 지나가버린 결과가 터졌습니다.ㅡㅡ
redhat9.0에서 컴파일해서 그 결과로 8.0에서 돌리려고 했더니만 glibc_2.3.2가 필요하다는군요.
프로그램이 사용하는 라이브러리는 net-snmp, crypto, pthread가 있는데 제 생각에는 pthread가 범인인것 같아요. 맞나...
net-snmp랑 crypto는 정적으로 링크시킨거거든요.
다시 해결하려고 시도하는데 어렵네요. 위에 pynoos님이 '그 놈들' 뒤에 라고 하셨는데 '그 놈들'이 .o 화일을 얘기하는 건가요? 그렇다면 makefile내에서 그 .o 화일뒤에 라이브러리를 넣으라고 하는 건지... makefile 내에서 pthread 라이브러리 넣는 위치에 따라 에러가 천지차이더라구요.

/usr/lib/libpthread.a(pthread.o)(.data+0x1b8): undefinded reference to '_errno'
위치를 바꾸면 이런 류의 메세지가 수없이 많이... 저를 압박합니다.
pthread는 정적으로 링크시킬 수 없나요... 쓰고 보니... 아니겠죠 ㅡ..ㅡ
같이 고민해 주실분이나 조언 주실분을 기다립니다.

Heading, heading again, again, ... ㅜㅜ 피난다

pynoos의 이미지

라이브러리를 명령행에 두는 순서는

Undefined로 되어 있는 것을 앞에 두고, define 된것이 뒤로 가야합니다. 그리고, redhat9.0에서 빌드한것을 하위 OS에서 돌릴경우 생기는 문제는 당연한것입니다. 될 수 있으면 하위 OS에서 빌드하시고 상위 OS도 커버할 수 있도록하시는 것이 좋습니다.

왜냐면, 라이브러리 버전이 높은 곳에서 컴파일 한 다음 낮은 곳으로 가면 안돌아갈 수가 많습니다. undefined symbol들이 많을 테니까요. 하지만, 하위에서 빌드한 것은 같은 배포판이라면 지원을 합니다. 또는 지원용 compat- 으로 시작하는 package를 제공합니다.

pthread를 static으로 하는 것은 안좋은 것일 텐데요..

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.