[완료] xpdp1 이라는 프로그램을 설치하는데 발생한 에러
글쓴이: injh97 / 작성시간: 목, 2009/07/30 - 10:08오전
VMware로 fedora11을 설치했습니다.
거기서 xpdp1이라는 프로그램을 설치하는데 다음과 같은 에러가 발생했습니다.
gcc -o ../xpdp1 fft.o field.o move.o gather.o pdp1.o start.o load.o prest.o padjus.o initwin.o maxwellv.o mccdiaginit.o xsect.o argonmcc.o heliummcc.o neonmcc.o oxygenmcc.o mcc.o -L/usr/local/lib -L/usr/local/lib -L/usr/X11R6/lib -lXGC250 -ltk -ltcl -lXpm -lX11 -lm -ldl
/usr/bin/ld: cannot find -lXGC250
collect2: ld returned 1 exit status
make: *** [../xpdp1] 오류 1
어떻게 해야 할까요?
아시는 분 답변 부탁드립니다.
Forums:
체크해 보셔야 할 것들.
xgrafix를 컴파일하면 libXGC250.a이라는 라이브러리가 생깁니다.
xgrafix를 설치할 때 'make install' 명령에 의해서 libXGC250.a가 /usr/local/lib 아래로 들어가게 되죠.
xpdp1을 컴파일할 때 -L/usr/local/lib 옵션으로 라이브러리를
/usr/local/lib에서 찾도록 한 것이기 때문에 위에서 말한대로 xgrafix가 설치되었다면
저런 에러 메시지를 내지 않을 것입니다.
결국, 어느 부분이 원하는대로 작동하지 않는지 알아야 합니다.
먼저 xgrafix 디렉토리 아래의 src밑에 libXGC250.a이 생성되어있는지 확인합니다.
생성되어있지 않다면 xgrafix를 다시 컴파일해야합니다.
생성되어있다면 /usr/local/lib 아래에 그 파일이 들어가 있는지 확인해야 합니다.
없다면 'make install' 을 다시 한번 실행시켜볼 필요가 있습니다.
단지 libXGC250.a이 복사되는 디렉토리가 다르다면
xgrafix의 설정파일을 고쳐서 libXGC250.a이 복사되는 위치를 /usr/local/lib으로 고치거나
xpdp1의 sec/makefile의 /usr/local/lib을 고쳐서 libXGC250.a을 제 위치에서 찾도록 하는 것이지요.
libXGC250.a 를 찾았습니다.
xpdp1에 대해 잘 아시는 분을 뵙게 되어서 반갑습니다.
find로 libXGC250.a 가 /usr/local/xgrafix/lib에 있는 것을 확인했습니다.
그래서 xpdp1의 makefile에서 /usr/local/lib를 /usr/local/xgrafix/lib로 변경하였습니다.
그리고 다시 make를 했는데 다음 에러가 나타납니다.
gcc -o ../xpdp1 fft.o field.o move.o gather.o pdp1.o start.o load.o prest.o padjus.o initwin.o maxwellv.o mccdiaginit.o xsect.o argonmcc.o heliummcc.o neonmcc.o oxygenmcc.o mcc.o -L/usr/local/xgrafix/lib -L/usr/local/xgrafix/lib -L/src/local/lib -L/usr/X11R6/lib -lXGC250 -ltk -ltcl -lXpm -lX11 -lm -ldl
/usr/bin/ld: cannot find -ltk
collect2: ld returned 1 exit status
make: *** [../xpdp1] 오류 1
이전하고 비슷한 오류라서 libtk.a를 찾아봤는데 그런 이름의 화일은 없고
libtkstub8.4.a라는 화일이 /usr/local/lib에 있었습니다.
제가 tcl8.4.19와 tk8.4.19을 설치했는데 혹시 그것 때문인지 모르겠습니다.
어떻게 해야 해결이 될까요?
아마 libtkstub8.4.a와
아마 libtkstub8.4.a와 같은 디렉토리에서 libtk.so를 찾으실 수 있을 것이니다.
라이브러리 파일은 lib*.a 형태를 갖기도 하지만 lib*.so 형태를 갖기도 합니다.
lib*.a 형태의 파일은 정적 라이브러리라고 해서 실행 파일에 직접 포함되지만
lib*.so 형태의 라이브러리는 동적 라리브러리라고 하며 단지 실행파일에 링크만 됩니다.
실제 실행파일이 실행될 때 참조되는 것이죠.
gcc는 lib*.so와 lib*.a를 모두 찾게 됩니다.
만약 /usr/local/lib에서 libtk.so를 찾을 수 있다면 gcc 컴파일 옵션으로
역시 -L/usr/local/lib를 추가하여
라이브러리를 그 디렉토리에서 검색하도록 하면 될 것입니다.
답글
답글 감사합니다.
libtk8.4.so와 libtcl8.4.so가 있고 libtk.so와 libtcl.so는 없었습니다. 그래서
makefile의
-lXGC250 -ltk -ltcl -lXpm -lX11 -lm -ldl
를
-lXGC250 -ltk8.4 -ltcl8.4 -lXpm -lX11 -lm -ldl
로 바꾸어서 다시 make를 하니까 잘 되었습니다.
그런데 xpdp1을 실행하니까 다음과 같은 에러가 다시 나타납니다.
./xpdp1: error while loading shared libraries: libtk8.4.so: cannot open shared object file: No such file or directory
어떻게 하면 될까요?
동적으로 링크된
동적으로 링크된 lib*.so 형태의 라이브러리는 프로그램이 샐행될 때 참조되어야 합니다.
참조할 때 정해진 디렉토리들을 뒤져서 그 라이브러리를 찾게 되는데 그 디렉토리 리스트에
/usr/local/lib가 포함되어있지 않는 것 같습니다.
저는 fedora가 아니라 gentoo를 쓰고 있어서 약간의 차이가 있을 수 있고 어떤 것들은 다르게 작용할 수도 있습니다.
그래서 제가 몇가지를 알려드릴테니 시도해 보시기 바랍니다. 한 가지가 작동하면 다른 것은 해 볼 필요가 없습니다.
1. 홈 디렉토리에 있는 .bashrc 란 파일을 열어서 다음의 라인을 추가시킵니다.
export LD_LIBRARY_PATH="/usr/local/lib:${LD_LIBRARY_PATH}"
그 다음 'source .bashrc'란 명령을 실행시키거나 다시 로그인을 합니다.
2. root로 변신합니다. 그 다음 /etc/ld.so.conf 를 엽니다.
그 파일에 /usr/local/lib 를 추가하고 /sbin/ldconfig 란 명령을 실행시킵니다.
직접 확인은 안 해 봤지만 fedora 관련해서 찾아보니 이런 식으로 라이브러리 디렉토리 리스트를 업데이트 하는 것 같더군요.
하지만 제가 확인해 본 것이 아니라서 확실히 모르겠습니다. 예를 들어, 제가 쓰는 gentoo의 경우에는 이 파일을
사람이 편집하는 것이 아니라 다른 프로그램에서 자동으로 생성하기 때문에 다른 곳을 건드려줘야 합니다.
이 경우 /etc/ld.so.conf 안에 '이 파일은 자동적으로 생성된거다' 라는 취지의 코멘트가 포함되어 있을 것입니다.
이 경우 반드시 3번 혹은 다른 방법을 써야 합니다. 그렇지 않다면 3번은 보실 필요가 없습니다.
3. gentoo의 경우 /etc/env.d/00basic 란 파일을 편집해야 합니다.
LDPATH="/usr/local/lib"
의 내용을 추가해줘야 합니다. LDPATH="..." 같은 내용이 이미 있다면
LDPATH="/usr/local/lib:..." 형태로 편집해주셔야 합니다.
그 다음 /usr/sbin/env-update 를 실행시켜줍니다.
물론, 이 방법은 gentoo의 방식이기 때문에 fedora에서는 다를 수도 있고 그 경우 다른 방법을 찾아야 합니다.
감사합니다. 도움이
감사합니다. 도움이 많이 되었습니다.
1번을 하니까 실행이 잘 됩니다.
댓글 달기