[질문] 라이브러리 링크에 대한 질문입니다..

yhjj777의 이미지

분명히 컴파일이 제대로 된 라이브러리인데도 링크가 제대로 되질 않습니다.
undefined reference to xx 이러면서요.
Makefile에도 이상이 없어 한참을 고민하다가 Makefile에서 라이브러리와 오브젝트의 순서를 바꿔주니 에러 메세지는 줄긴했지만 문제가 해결이 되진않네요.. 단방향으로 호출할 경우에는 순서를 바꿔주는걸로 해결이 되지만.. 양쪽으로 서로 호출하는 경우에는 -.-;
전체 클래스의 수가 약 삼백개정도 되는데,,.. 클래스가 많을 경우에 컴파일에 문제가 생기는 경우가 있을까요? 혹시 저와 같은 비슷한 상황을 경험해보신 분이 계시다면 답변 좀 해주세요. freebsd에서 g++ 2.95.4를 사용합니다.

pynoos의 이미지

부분부분 archive를 만들어서 link하면 되지 않을까요?

yhjj777의 이미지

패키지별로 나눠서 아카이브 만들었는데도 이러네요.. -.-;

pynoos의 이미지

에러메시지를 다 올려주시죠?

다른 문제가 있어보입니다만... :)

yhjj777의 이미지

../../lib/libmap.a(Position.o): In function `Position::Set(unsigned char, unsigned int, unsigned int)':
/home/edgy/ffo/map/objs/.././Position.cpp:83: undefined reference to `MapController::GetCount(void)'
../../lib/libmap.a(MapController.o): In function `MapController::GetPIdx(unsigned char)':
/home/edgy/ffo/map/objs/.././MapController.cpp:65: undefined reference to `Planet::GetID(void)'
../../lib/libmap.a(MapController.o): In function `MapController::GetPID(unsigned char)':
/home/edgy/ffo/map/objs/.././MapController.cpp:65: undefined reference to `Planet::GetID(void)'
../../lib/libmob.a(MobScheduler.o): In function `MobScheduler::Do(void)':
.././MobScheduler.cpp(.text+0x6cc): undefined reference to `MobScheduler::lmsl'
../../lib/libmob.a(MobScheduler.o): In function `MobScheduler::Add(Mob *)':
.././MobScheduler.cpp(.text+0x80c): undefined reference to `MobScheduler::lmsl'
../../lib/libmob.a(MobBaseController.o): In function `MobBaseController::Load(void)':
.././MobBaseController.cpp(.text+0x277): undefined reference to `StaticRep::Instance(void)'
.././MobBaseController.cpp(.text+0x28b): undefined reference to `StaticRep::LoadMobBases(MobBase *, int)'
../../lib/libsection.a(SectionProxy.o): In function `SectionProxy::~SectionProxy(void)':
/home/edgy/ffo/section/objs/.././SectionProxy.cpp(.gnu.linkonce.d._vt$12SectionProxy+0x1c): undefined reference to `SectionProxy::GetPos(void)'
pynoos의 이미지

만약 상호 참조하는 문제때문에 생기는 것이라면 일단..
object나 archive 들이 아래 두 곳이 있다고 가정하고..

nm -A -C /home/edgy/ffo/map/objs/*.o /home/edgy/ffo/lib/lib*.a

를 실행했을때 모두 "U" 아닌 "T" 로 해당하는 곳이 한 개가 나와야합니다.

../../lib/libmap.a(Position.o): In function `Position::Set(unsigned char, unsigned int, unsigned int)': 
/home/edgy/ffo/map/objs/.././Position.cpp:83: undefined reference to `MapController::GetCount(void)' 

nm -A -C /home/edgy/ffo/map/objs/*.o /home/edgy/ffo/lib/lib*.a | grep MapController
해서 MapController::GetCount(void) 에 해당하는 "T" 가 발견되나요?

../../lib/libmap.a(MapController.o): In function `MapController::GetPIdx(unsigned char)': 
/home/edgy/ffo/map/objs/.././MapController.cpp:65: undefined reference to `Planet::GetID(void)' 
../../lib/libmap.a(MapController.o): In function `MapController::GetPID(unsigned char)': 
/home/edgy/ffo/map/objs/.././MapController.cpp:65: undefined reference to `Planet::GetID(void)' 

nm -A -C /home/edgy/ffo/map/objs/*.o /home/edgy/ffo/lib/lib*.a | grep Planet
해서 Planet::GetID(void)에 해당하는 "T" 가 발견되나요?

추가적으로..

../../lib/libmob.a(MobScheduler.o): In function `MobScheduler::Do(void)': 
.././MobScheduler.cpp(.text+0x6cc): undefined reference to `MobScheduler::lmsl' 
../../lib/libmob.a(MobScheduler.o): In function `MobScheduler::Add(Mob *)': 
.././MobScheduler.cpp(.text+0x80c): undefined reference to `MobScheduler::lmsl' 

static 변수가 선언된후에 정의가 안되어 있는것 같습니다.

../../lib/libmob.a(MobBaseController.o): In function `MobBaseController::Load(void)': 
.././MobBaseController.cpp(.text+0x277): undefined reference to `StaticRep::Instance(void)' 
.././MobBaseController.cpp(.text+0x28b): undefined reference to `StaticRep::LoadMobBases(MobBase *, int)' 

위처럼 해결하시고..

이건....아마도

../../lib/libsection.a(SectionProxy.o): In function `SectionProxy::~SectionProxy(void)': 
/home/edgy/ffo/section/objs/.././SectionProxy.cpp(.gnu.linkonce.d._vt$12SectionProxy+0x1c): undefined reference to `SectionProxy::GetPos(void)'

virtual function은 사용하지 않아도 모두 만들어줘야 하는데, 없다는 것네요.
SectionProxy::GetPos(void) 함수가 존재하나요?

yhjj777의 이미지

이 문제때문에 며칠을 고생할거같았는데 덕분에 쉽게 문제를 해결했습니다.
정말 감사합니다 :D

pynoos의 이미지

다행이군요..!

최종호의 이미지

yhjj777 wrote:
이 문제때문에 며칠을 고생할거같았는데 덕분에 쉽게 문제를 해결했습니다.
정말 감사합니다 :D

근데 문제가 뭐였나요? pynoos 님께서 몇가지 말씀을 해 주셨는데,,
virtual function의 문제였나요? ㅡ.ㅡ?
덕분에 무인승차좀.. ㅡ,.ㅡ

yhjj777의 이미지

1. static 변수 초기화를 안함.
2. header 파일에만 함수를 선언하구 구현을 안함.
3. Makefile에서의 라이브러리 링크 순서

1,2번같은 경우에는 컴파일이 제대로 되서 이 문제일거라고는
생각도 못했는데.. -.-; 3번같은 경우는... 링크한 라이브러리의
수가 많아지니,, 순서까지 신경을 써줘야되더군요..

펑키의 이미지

안녕하세요.

여담입니다.

3번의 경우에는 저도 당해보았습니다. HP10 에서 경험한것인데 정말 난감하더군요. 링킹 순서가 존재하리라고는 상상을 못해보았거든요. 더불어서 HP10에서는 너무도 많은 제약이 존재해서 조금 힘들게 해보았던 경험이 있습니다.

댓글 달기

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