[완료] undefined reference 에러에서. .
글쓴이: ash84 / 작성시간: 화, 2012/04/17 - 6:27오후
/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 에 링킹을 걸어줘야 한다던데 어떻게 거는지좀 알려주세요 ㅠㅠ
Forums:
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.
ldd 확인 결과..
[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는 컴파일 타임이 아닌,
LD_LIBRARY_PATH는 컴파일 타임이 아닌, 컴파일과 링킹이 끝나고 exec 파일이 생선된 후에, 사용자가 실행을 할때 로더에서 사용하는 환경 설정입니다.
즉, MAKE파일에 설정하지 마시고 쉘상에서 쉘 환경 변수로 설정을 하고 사용해 보세요.
그리고 경로는 상대경로 대신 절대 경로를 사용하시고요.
제가 이런 문제를 겪었을 때의 경험에 비춰보면 결국
제가 이런 문제를 겪었을 때의 경험에 비춰보면
결국 -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.
./lib/linux/not/lib/ 이경로가 좀 이상한데여
일반적으로 실행시간에 사용하는 공유 라이브러리는
/lib/나 /usr/lib/에 넣고 사용하는데
저기에 있으면 프로그램에서 못 찾을 거 같은데
즐린
/lib/나 /usr/lib/에 두는 것은 설치할
/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.
지금의 문제는 실행시간이 아니고 컴파일시간중의
지금의 문제는 실행시간이 아니고 컴파일시간중의 문제같습니다.
Thanks for being one of those who care for people and mankind.
I'd like to be one of those as well.
일단 환경변수 LD_LIBRARY_PATH를
일단 환경변수 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라는 자체 소스가 없는 상황이라. ㅠ 난감하네요
컴파일타임에서는 라이브러리 위치 지정을 위해 gcc
컴파일타임에서는 라이브러리 위치 지정을 위해 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.
아 죄송합니다. 제가 모르면서 너무 잘난척한 것
아 죄송합니다.
제가 모르면서 너무 잘난척한 것 같아요...
다른 분 의견을 더 귀담아주세요...
제가 도움 드리려 했는데
너무 자신이 없는 내용이네요.. 흑.
Thanks for being one of those who care for people and mankind.
I'd like to be one of those as well.
음 ..
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 』
감사합니다.
감사합니다. 다행히 위에서 설명해주신
-L./lib/linux/not/lib 넣고, LIBS 에 -lnotes -lndgts -lxmlproc 로 하니까 되네요 ^^
정말 감사합니다. 컴파일 옵션이나 makefile 에 대해서 좀더 공부를 해야 겠네요.
다른 분들도 너무 신경 써주셔서 감사합니다.
제가 괜히 혼란스럽게 한 것 같아 죄송합니다.
제가 괜히 혼란스럽게 한 것 같아 죄송합니다.
Thanks for being one of those who care for people and mankind.
I'd like to be one of those as well.
음 ..
중간에 피드백이 있었기 때문에, 상황에 대한 유추가 좀 더 용이했습니다.
가급적 질문이 클리어해서 단답이 가능한 경우에만 가끔 댓글을 달기 때문에..
본문만 있는 상태였다면, 쉽게 도움을 드리지 못했을 겁니다.
답도 중요하지만, 소통을 통해 답을 찾아가는 과정 역시도 중요한 것 같습니다.
되면 한다! / feel no sorrow, feel no pain, feel no hurt, there's nothing gained.. only love will then remain.. 『 Mizz 』
네 그렇다면 다행입니다. *^^*
네 그렇다면 다행입니다. *^^*
Thanks for being one of those who care for people and mankind.
I'd like to be one of those as well.
댓글 달기