라이브러리 충돌 문제.

theone3의 이미지

먼저 간략히 설명을 드리겠습니다.
A라는 프로그램이 있습니다.
A라는 프로그램은 aaa.cpp, bbb.cpp, ccc.cpp 로 구성이 되어 있고,
ddd.a라는 라이브러리를 링크합니다.
ddd.a라는 라이브러리는 ddd.cpp, eee.cpp, fff.cpp로 구성이 되어 있습니다.
그 중에서 ddd.cpp를 A라는 프로그램에서 직접 쓰도록 만들었습니다.
따라서 A라는 프로그램은
aaa.cpp, bbb.cpp, ccc.cpp, ddd.cpp 로 만들어지고,
ddd.a라는 라이브러리는 ddd.cpp, eee.cpp, fff.cpp로 만들어집니다.
A라는 프로그램에서 ddd.a 를 링크해서 쓸때,
자신의 로컬파일에도 ddd.cpp가 있고, ddd.a라이브러리 안에도 ddd.cpp 가 있어서,
서로 충돌이 날 것으로 예상이 됩니다.(ddd.cpp안에 같은 symbol이 정의되어 있기 때문에)
그런데 직접 실행을 해보니, 충돌이 나지 않습니다.
이유를 설명해 주시면 감사하겠습니다.

ted78의 이미지

라이브러리는 *.o, 즉 object 파일의 모임이며 cpp 파일과는 직접적으로 아무 연관이 없습니다.

나는 생각하는 갈대다?

theone3의 이미지

음.. 생각해 보니, 제가 질문을 제대로 못 드린 것 같습니다.
물론 위의 상황은 전부다 *.cpp => *.o 로 변환된 이후의 상황을 말씀드리는 겁니다.

요약해서 질문하자면,
라이브러리에 있는 *.cpp 파일을 복사해서
현재 프로그램에 끼워넣기식으로 쓰게 되면,
같은 *.cpp 파일이 두 군데 존재하고,
컴파일을 해서 *.o 파일이 생기고,
다시 라이브러리를 링킹하면(*.a)
같은 코드가 하나의 프로그램 안에
두번 들어가게 되는 형태가 됩니다.

제 생각에는 링크를 할때부터 같은 코드가
(물론 오브젝트 형태지만)
두번 정의가 되어 있기 때문에,
링크 에러가 날 것으로 예상을 했지만,
링크 에러가 나지 않았습니다.

제가 설명이 부족해서 혼란을 드린 것 같습니다.

당신은 사랑받기 위해 태어난 사람.

이준의 이미지

링커의 특성입니다.

링커가 링크을 할때 archive 파일의 경우는 없는 레퍼런스에 대해서만 참고 하게 됩니다.

그리고 커맨드 라인에서 넣어주신 순서대로 먼저 레퍼런스를 참조 합니다.

아마 컴파일하실때 충돌을 예상하신 .o 보다 뒤쪽에 .a를 두셨을것 같은데요..

.a를 보다 앞에 두시면 뒤에 .o에서 중복에러가 나실겁니다.^^

즉 링커 특성상 .a에서는 없는 레퍼런스만 찾을려고 하기때문에 그런것입니다

커맨드 라인에서 .a를 중복을 예상하시는 .o보다 앞쪽에 놓으시면 에러를 보실수 있습니다.

즉 .a가 뒤쪽에 위치하면 링커는 이미 해당 함수에 대해서 레퍼런스가 앞쪽에서 지정한 obj에 있기때문에 무시하게 됩니다.

링커의 특성임으로 굳이 이유를 달지 않아도 될것 같네요..

링커 문서를 보시면 나와 있는 내용입니다.

Hyo-Sung Lee(李曉星/Mark Lee)

KRSF Certified Inline Skate Instructor
Fitness Inline Skate Trainer
Mogul&Freeride Skier
IDOne ski rider
Cafe MogulBuddy/KoreaMogul
E-Leader(C) Programmer

익명 사용자의 이미지

nayalee님 감사합니다.

제가 원하는 질문에 정확한 답이네요. ^^

내일 가서 .a를 .o보다 먼저 참조하도록 해서 에러가 나는지 확인 해 보면 되겠습니다.

말씀하신 링커 문서를 소개시켜주시면 감사하겠습니다.

이런 류의 문서는 왠지 찾기가 힘들더군요.

일반적인 프로그래밍 책에서도 보기 힘들구요.

혹 저만 모르는 건 아닌지는 모르겠습니다.

좋은 하루 되세요.

theone3의 이미지

윗글 제가 쓴 겁니다. 로그인을 안했네요.

당신은 사랑받기 위해 태어난 사람.

이준의 이미지

sun에서..

linker and libraries guide 를 찾아서 보세요^^;

정확한 경로는 잘 모르겠습니다. 쉽게 검색하실수 있습니다.

리눅스용 ld와 같은 특성일지는 잘 모르겟습니다...

아마 비슷할겁니다..

말씀대로 이런 내용은 잘 나와 있지 않으니까..

열심히 공부좀 해서 관련 책을 하나 써보면 좋지 않을까요?

ㅋㅋ

Hyo-Sung Lee(李曉星/Mark Lee)

KRSF Certified Inline Skate Instructor
Fitness Inline Skate Trainer
Mogul&Freeride Skier
IDOne ski rider
Cafe MogulBuddy/KoreaMogul
E-Leader(C) Programmer

댓글 달기

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