프로그램 Compile & Run Error
글쓴이: bueline / 작성시간: 월, 2010/03/22 - 2:20오후
JNI와 관련한 프로그램을 만들었습니다.
프로그램을 Compile해서 실행하면 실행이 잘 되는데
안되는 경우가 발생해서 이것저것 찾아보다가 이해가 안되는 상황이 있어서 질문합니다.
하나의 터미널을 열어서 make로 compile하고 그 터미널에서 실행을하면
프로그램이 오류없이 프로그램을 진행합니다.
하지만, 다른 터미널을 열어서 프로그램을 실행하게 되면 프로그램이 오류를 발생합니다.
발생오류는 Java의 Method를 찾지 못한다는 Error인데요
오류 발생후에 다시 컴파일을 했던 터미널에서 실행하면 오류없이 실행이 됩니다.
어떤 이유로 컴파일이 되지 않은 터미널에서 프로그램을 실행하면 오류가 발생하는지 궁금합니다.
Forums:
두 터미널에서 export
두 터미널에서 export 하여 환경 변수 값을 비교해보세요
인생은 도박이다.
환경변수값은 같습니다.
두 터미널에서 export해서 값을 비교하면 값은 같습니다.
한 터미널에서 안될때 다시 그 터미널에서 컴파일하면 프로그램이 실행됩니다.
어떤이유인지 정말 궁금하네요 쩝
한번 echo $CLASSPATH값 비교해보세여
이게 다를 경우 메소드 못찾을수도 있습니다.
즐린
즐린
똑같습니다.
같은 계정으로 접속하기 때문에 환경설정 값이 변경되는 일은 없다고 보는데요
그래도 혹시나해서 찾아보았지만 역시나네요
다른건 모르겠지만 지금 프로그램이
JNI를 사용한건데요
그 쪽과 관련해서 설정을 찾아봐야 하는건 아닌가 싶은데요
많은 분들의 조언 부탁드릴께요
환경 설정을
환경 설정을 비교할때 하나는 make를 하고 다른 하나는 make를 안하고 비교해보신거죠??
make과정에서 환경설정이 바뀔수있습니다..
말씀하신 증상으로는 환경설정밖에 의심되는 부분이 없는데
좀더 다양하고 많은 정보를 주시면 다른분들이 답변하기 쉬울듯 하네요
인생은 도박이다.
LD_LIBRARY_PATH지정
JNI에서 네이티브 메소드를 찾기 위해서는 컴파일해서 만든 shared library를
참조할 수 있어야 합니다. 이때 참조 경로는 리눅스의 경우 LD_LIBRARY_PATH에
있는 디렉토리들을 차례로 찾게 되지요.
가능한 시나리오는 2가지일것 같습니다.
1. 님께서 사용한 makefile에 LD_LIBRARY_PATH를 만들어진 .so파일이
있는 디렉토리로 설정하는 코드가 들어가 있는 경우
-> 이경우 다른 분들이 말씀하신대로 양 터미널의 환경변수를
비교해서 LD_LIBRARY_PATH나 CLASSPATH에 차이가 있는지 확인하신 후
그에 맞게 .bash에서 환경 변수를 변경하면 됩니다.
2. LD_LIBRARY_PATH에 .(현재 디렉토리)이 들어가 있는데,
양 터미널에서 java를 실행한 위치가 달랐다.
-> make를 한 터미널에서는 .so파일이 있는 디렉토리에서 java mainclass 라는 형태로
실행을 하고, 새로 띄운 터미널에서는 다른 디렉토리에서 실행을 했다면
당연히 두번째 경우에는 .so파일을 찾지 못해서 프로그램이 중단됩니다.
아따~~~ 에러메시지라도 보여줘야~~~
말로 에러난다고 하는것 보다, 에러난 메시지를 캡춰해서 붙여주시는 센스~~~
- 겨울아찌 -
winchild@kldp.org
- 겨울아찌 -
winchild@gmail.com
make 후 환경값
실행이 되는 터미널의 값
LD_LIBRARY_PATH=:/usr/java/jdk1.5.0_22/jre/lib/i386:/usr/java/jdk1.5.0_22/jre/lib/i386/client
LS_COLORS=no=00:fi=00:di=01;34:ln=01;36:pi=40;33:so=01;35:bd=40;33;01:cd=40;33;01:or=01;05;37;41:mi=01;05;37;41:ex=01;32:*.cmd=01;32:*.exe=01;32:*.com=01;32:*.btm=01;32:*.bat=01;32:*.sh=01;32:*.csh=01;32:*.tar=01;31:*.tgz=01;31:*.arj=01;31:*.taz=01;31:*.lzh=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.gz=01;31:*.bz2=01;31:*.bz=01;31:*.tz=01;31:*.rpm=01;31:*.cpio=01;31:*.jpg=01;35:*.gif=01;35:*.bmp=01;35:*.xbm=01;35:*.xpm=01;35:*.png=01;35:*.tif=01;35:
SSH_AUTH_SOCK=/tmp/ssh-eZSol23180/agent.23180
MAIL=/var/spool/mail/cam
PATH=/usr/kerberos/bin:/usr/local/bin:/bin:/usr/bin:/usr/java/jdk1.5.0_22/bin:/usr/java/jdk1.5.0_22/jre/lib/i386/client:/usr/local/mysql/bin:/home/cam/bin
INPUTRC=/etc/inputrc
PWD=/home/cam/server/src/java
JAVA_HOME=/usr/java/jdk1.5.0_22
실행이 제대로 되지 않는 메소드 참조오류가 나는 터미널의 값
LD_LIBRARY_PATH=:/usr/java/jdk1.5.0_22/jre/lib/i386:/usr/java/jdk1.5.0_22/jre/lib/i386/client
LS_COLORS=no=00:fi=00:di=01;34:ln=01;36:pi=40;33:so=01;35:bd=40;33;01:cd=40;33;01:or=01;05;37;41:mi=01;05;37;41:ex=01;32:*.cmd=01;32:*.exe=01;32:*.com=01;32:*.btm=01;32:*.bat=01;32:*.sh=01;32:*.csh=01;32:*.tar=01;31:*.tgz=01;31:*.arj=01;31:*.taz=01;31:*.lzh=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.gz=01;31:*.bz2=01;31:*.bz=01;31:*.tz=01;31:*.rpm=01;31:*.cpio=01;31:*.jpg=01;35:*.gif=01;35:*.bmp=01;35:*.xbm=01;35:*.xpm=01;35:*.png=01;35:*.tif=01;35:
SSH_AUTH_SOCK=/tmp/ssh-epuMB23206/agent.23206
MAIL=/var/spool/mail/cam
PATH=/usr/kerberos/bin:/usr/local/bin:/bin:/usr/bin:/usr/java/jdk1.5.0_22/bin:/usr/java/jdk1.5.0_22/jre/lib/i386/client:/usr/local/mysql/bin:/home/cam/bin
INPUTRC=/etc/inputrc
PWD=/home/cam
JAVA_HOME=/usr/java/jdk1.5.0_22
두곳의 값은 똑같아서 차이점을 확인할 수가 없더라구요
제가 실행한 make 파일을 올리도록 하겠습니다.
LIB_PATH = ../../lib
INSTALL_PATH = ../../bin
CC = g++
COMP = -Wall -c \
-I. \
-I/usr/include \
-I/usr/local/mysql/include/mysql \
-I../../include/lib \
-I../../include \
-I$(JAVA_HOME)/include \
-I$(JAVA_HOME)/include/linux
LIB = $(LIB_PATH)/common_function.o\
$(LIB_PATH)/shared_memory.o\
$(LIB_PATH)/database_function.o
LINK = -L/usr/local/mysql/lib/mysql -L$(JAVA_HOME)/jre/lib/i386/client -L. -ljvm -lm -lz -lpthread -lmysqlclient -lcurses -Xlinker -zmuldefs
CPGM = template_count template_end
all : $(CPGM) \
clean
$(LIBS) : $@
$(CC) $(COMP) $@.cc
$(CPGM) : $@
$(CC) $(COMP) $@.cc
$(CC) -o $(INSTALL_PATH)/$@ $@.o $(LIB) $(LINK)
install :
cp *.h ../../include/lib
cp *.o ../../lib
clean :
rm -f *.o *.lis tp*
이런식으로 되어 있는 makefile을 만들어서 컴파일 하였습니다.
컴파일시에 오류는 발생하지 않고 있고요
제가 심어놓은 로그를 보면
clsH = env->FindClass("ConversionSchedule");
이부분에서 clsH가 NULL 값이 되고 있습니다.
댓글 달기