[완료] undefined reference 에러에서. .

ash84의 이미지

/usr/bin/ld: warning: libndgts.so, needed by ./lib/linux/not/lib/libnotes.so, not found (try using -rpath or -rpath-link)
/usr/bin/ld: warning: libxmlproc.so, needed by ./lib/linux/not/lib/libnotes.so, not found (try using -rpath or -rpath-link)
./lib/linux/not/lib/libnotes.so: undefined reference to `XmlFormatter::operator<<(unsigned short const*)@xmlproc_v1.00'

이런식으로 메시지가 나오는데 ./lib/linux/not/lib/ 라는 경로에 libnotes.so 파일과 libndgts.so, libxmlproc.so 두개의 파일이 같이 있는데 왜

문제인걸까요?

어디서 보니까 . libnotes.so 에 링킹을 걸어줘야 한다던데 어떻게 거는지좀 알려주세요 ㅠㅠ

oosap의 이미지

ldd libnotes.so

해보세요.

linux-vdso.so.1 => (0x00007fffc2afc000)
libdl.so.2 => /lib/libdl.so.2 (0x00007f4b7bf7f000)
librt.so.1 => /lib/librt.so.1 (0x00007f4b7bd77000)
libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0x00007f4b7ba62000)
libm.so.6 => /lib/libm.so.6 (0x00007f4b7b7df000)
libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x00007f4b7b5c8000)
libpthread.so.0 => /lib/libpthread.so.0 (0x00007f4b7b3aa000)
libc.so.6 => /lib/libc.so.6 (0x00007f4b7b027000)
/lib64/ld-linux-x86-64.so.2 (0x00007f4b7c540000)

이렇게 알려주는 위치에 해당 공유라이브러리들이 존재하나요?

Thanks for being one of those who care for people and mankind.
I'd like to be one of those as well.

ash84의 이미지

[lib]$ ldd libnotes.so
linux-gate.so.1 => (0xffffe000)
libndgts.so => not found
libdl.so.2 => /lib/libdl.so.2 (0xf6819000)
librt.so.1 => /lib/tls/librt.so.1 (0xf6805000)
libstdc++.so.5 => /usr/lib/libstdc++.so.5 (0xf6749000)
libpthread.so.0 => /lib/tls/libpthread.so.0 (0xf6737000)
libresolv.so.2 => /lib/libresolv.so.2 (0xf6724000)
libc.so.6 => /lib/tls/libc.so.6 (0xf65f9000)
libxmlproc.so => not found
libm.so.6 => /lib/tls/libm.so.6 (0xf65d6000)
libgcc_s.so.1 => /lib/libgcc_s.so.1 (0xf65ce000)
/lib/ld-linux.so.2 (0x56555000)

ldd 확인 결과 위와 같이 나와서 not found 가 나와서

Makefile 내에 아래처럼 LD_LIBRARY_PATH 를 추가했는데 안돼네요, 추가한게 잘못 된것일까요?

OS = linux
CC = gcc
LD_LIBRARY_PATH = ./lib/linux/not/lib
CFLAGS = -m32 -c -O5 -fPIC -fexceptions -Wno-deprecated
CFLAGS += -I.
CFLAGS += -D_UNIX $(DEBUG_FLAGS) -DLINUX -DUNIX
CFLAGS += -D__32BIT
LIBS += -m32 -lm -lnsl -lpthread -lc -ldl -lresolv
SO_FLAGS = -shared

익명 사용자의 이미지

LD_LIBRARY_PATH는 컴파일 타임이 아닌, 컴파일과 링킹이 끝나고 exec 파일이 생선된 후에, 사용자가 실행을 할때 로더에서 사용하는 환경 설정입니다.
즉, MAKE파일에 설정하지 마시고 쉘상에서 쉘 환경 변수로 설정을 하고 사용해 보세요.
그리고 경로는 상대경로 대신 절대 경로를 사용하시고요.

oosap의 이미지

제가 이런 문제를 겪었을 때의 경험에 비춰보면
결국 -l 옵션이 너무 앞쪽에 위치해있어서 문제였습니다.

gcc -o binary_name -Llibrary_path -Iinclude_path target_object_1.o target_object_2.o ... target_object_n.o -llibrary_0 -llibrary_1

이렇게 되야하는 것이죠.
1. 즉, target_object_1.o target_object_2.o ... target_object_n.o 보다 뒤쪽에 -llibrary_0 -llibrary_1 가 배치되어야 한다는 것입니다.

2. 그리고 so 공유라이브러리를 만드신다면 -soname 옵션도 사용하셔야 할 겁니다. gcc 에서는 -Wl,-soname,so_name 이런 식으로요...

2번은 필수사항인지는 모르겠습니다.. 1번의 링크에 쓸 라이브러리명을 나열하는 건 거의 필수사항이예요. gcc 최신버전에서는요... 어떤 버전에서는 문제가 없기도 하지만요..

Thanks for being one of those who care for people and mankind.
I'd like to be one of those as well.

hys545의 이미지

일반적으로 실행시간에 사용하는 공유 라이브러리는
/lib/나 /usr/lib/에 넣고 사용하는데
저기에 있으면 프로그램에서 못 찾을 거 같은데

즐린

oosap의 이미지

/lib/나 /usr/lib/에 두는 것은 설치할 때이고 개발중에는 개발중인 소스코드 위치에 두고 사용하기도 해요.. 그런 경우 로더가 찾을 수 있게 LD_LIBRARY_PATH 를 쓰고요..

Thanks for being one of those who care for people and mankind.
I'd like to be one of those as well.

oosap의 이미지

지금의 문제는 실행시간이 아니고 컴파일시간중의 문제같습니다.

Thanks for being one of those who care for people and mankind.
I'd like to be one of those as well.

ash84의 이미지

일단 환경변수 LD_LIBRARY_PATH를

[lib]$ echo $LD_LIBRARY_PATH
/home/work/trunk/notes/lib/linux/not/lib

이렇게 잡고 해당 디렉토리에

libndgts.so, libxmlproc.so

파일 두개를 넣어서 make를 했는데 동일한 문제가 생기네요.

ldd 에서 not found가 안나오게 연결해 주려면 so 만들기 전에 위치를 잡아주어야만 하는 건가요?

libnots.so는 외부 so라는 자체 소스가 없는 상황이라. ㅠ 난감하네요

oosap의 이미지

컴파일타임에서는 라이브러리 위치 지정을 위해 gcc 나 g++ 에 -L 옵션을 줍니다.
LD_LIBRARY_PATH 는 다른 분 말씀처럼 로더에게 실행시간에 라이브러리 찾을 위치 알려주는 것입니다.

libnots.so 를 다시 만들어야 하는 상황 같은데요...

저도 경험이 많지 않아서 오히려 제 얘기로 혼란만 가중되시는거 아닌지 걱정입니다.
제 짧은 소견으로는 libnots.so 를 다시 만드는 방법밖에 없네요.

Thanks for being one of those who care for people and mankind.
I'd like to be one of those as well.

oosap의 이미지

아 죄송합니다.
제가 모르면서 너무 잘난척한 것 같아요...
다른 분 의견을 더 귀담아주세요...
제가 도움 드리려 했는데
너무 자신이 없는 내용이네요.. 흑.

Thanks for being one of those who care for people and mankind.
I'd like to be one of those as well.

ymir의 이미지

Makefile 이 없으니 내용 파악이 어렵긴 한데, libnotes.so 를 링크해서 뭔가를 빌드하다가 에러가 난거라면..
LDFLAGS 에 -L./lib/linux/not/lib 넣고, LIBS 에 -lnotes -lndgts -lxmlproc 추가하고 빌드해보면 어떻게 되나요?
libnotes.so 가 libndgts.so 하고 libxmlproc.so 에 dependency 가 걸려 있는 듯 하네요.

되면 한다! / feel no sorrow, feel no pain, feel no hurt, there's nothing gained.. only love will then remain.. 『 Mizz 』

ash84의 이미지

감사합니다. 다행히 위에서 설명해주신

-L./lib/linux/not/lib 넣고, LIBS 에 -lnotes -lndgts -lxmlproc 로 하니까 되네요 ^^

정말 감사합니다. 컴파일 옵션이나 makefile 에 대해서 좀더 공부를 해야 겠네요.

다른 분들도 너무 신경 써주셔서 감사합니다.

oosap의 이미지

제가 괜히 혼란스럽게 한 것 같아 죄송합니다.

Thanks for being one of those who care for people and mankind.
I'd like to be one of those as well.

ymir의 이미지

중간에 피드백이 있었기 때문에, 상황에 대한 유추가 좀 더 용이했습니다.
가급적 질문이 클리어해서 단답이 가능한 경우에만 가끔 댓글을 달기 때문에..
본문만 있는 상태였다면, 쉽게 도움을 드리지 못했을 겁니다.
답도 중요하지만, 소통을 통해 답을 찾아가는 과정 역시도 중요한 것 같습니다.

되면 한다! / feel no sorrow, feel no pain, feel no hurt, there's nothing gained.. only love will then remain.. 『 Mizz 』

oosap의 이미지

네 그렇다면 다행입니다. *^^*

Thanks for being one of those who care for people and mankind.
I'd like to be one of those as well.

댓글 달기

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