[완료] 라이브러리 생성시 의존성 채크방법

Nadia85의 이미지

다음과 같은 두 파일로 부터 라이브러리를 만들려고 합니다.

test1.c

int func1()
{
    func2();
}

test2.c

int func2()
{
    func3()
}

위의 두 코드를
gcc -c test1.c
gcc -c test2.c
로 오브젝트로 만들고

gcc -shared -O libtest.so test1.0 test2.o
를 사용해서 라이브러리를 만들었습니다.

그런데 test1,2 어디에도 func3() 함수가 정의 되어 있지 않은데. 라이브러리가 만들어 지네요.... 제가 보기엔 라이브러리가 만들어 지지 않아야 한다고 보는데요... 컴파일시 (-ㅣ옵션으로 추가 라이브러리를 써준 것도 아니고......)

실제로 실행 파일(main 함수가 있는 파일을 링크 할때)을 만들때 fun3()가 없다고 에러가 나긴 하는데, 라이브러리를 만들때 부터 에러가 나던지, 최소한 경고라도 받을 수 있는 방법이 없을까요?

jos77의 이미지

gcc -Wall 옵션 주면 나옵니다. (implicit declataion of function 'func3')

-----
안녕하세요 소프트웨어 공학센터 장원석 책임입니다.
http://www.software.kr

Nadia85의 이미지

-Wall 옵션 줘도 header 파일에 func3 가 있으면 경고 메시지는 나오지 않습니다.

즉 libtest.h에 func1 func2 func3가 다 있고 실수로 fund3를 구현하지 않고 라이브러리를 만들었을 경우를 말합니다.

jos77의 이미지

컴파일시 어딘가의 obj 가 링크될 것으로 예상하기 때문에 컴파일 명령 자체를 체크하지 않는 이상 해당 function 이 없어도 라이브러리는 항상 만들어질 수 있을 것 같습니다. 확인하려면 보통 가상 main 함수를 만들어서 실행파일로 컴파일을 시켜보는 방법을 쓰는데, 바로 라이브러리로 컴파일하면서 확인은 어려울 것 같습니다.

-----
안녕하세요 소프트웨어 공학센터 장원석 책임입니다.
http://www.software.kr

cinsk의 이미지

Nadia85의 이미지

답변 정말 감사 드립니다.

그리고 염치 없지만 하나만 더 질문 드릴께요......

그렇다면 func3()를 정의한 libtest3.so 라는 공유 라이브러리를 만들었습니다.
그리고
gcc -shared -O libtest.so test1.0 test2.o -L. -ltest3 를 사용해서 libtest.so를 다시 만들었습니다.

이렇게 하면 실행 파일을 만들때 ld가 libtest.so를 링크할 때 libtest3.so도 같이 링크 함을 확인 하였습니다. (실행 파일을 만들때 -ltest -ltest3를 함께 주지 않고 -ltest만 주어도 -ltest3를 같이 링크 하더군요 :) )

그런데 안타까운 점은 말씀하신 방법을 사용해서 libtest.so 를 살펴보면 똑같이 func3가 정의 되지 않은 심볼로 나옵니다. 실제 라이브러리에는 libtest3.so 를 링크해서 func3를 찾을 수 있는 방법이 있음에두 불구하고 이런 정보는 얻을 수가 없습니다.

이런경우에는 가짜 main을 만들어서 확인해 보는 방법 이외에는 없을까요?
(제가 알기론 라이브러리를 링크할때도 똑같은 링커가 사용되는 걸로 아는데 실행 파일을 만들땐 그런걸 다 검사해 주는데 라이브러리를 만들대는 그렇지 않아서요......)

cinsk의 이미지

shared library 또는 executable인 경우, ldd(1) 명령으로 의존성을 확인할 수 있습니다.

--
C FAQ: http://www.eskimo.com/~scs/C-faq/top.html
Korean Ver: http://www.cinsk.org/cfaqs/

댓글 달기

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