[해결] UNIX(AIX)에서 컴파일 할 경우 Shared Libary 참조 하려면 어떤방식으로 해야 되나요?
글쓴이: 조야 / 작성시간: 월, 2008/10/27 - 5:03오후
지금 Shared Libary 를 컴파일을 하긴 했는데...
이걸 Test를 해봐야 되는데..
Test 프로그램에 Shared Libary 를 참조 해서 컴파일 하려고 했는데 에러가 떠서 제가 멀 잘못했는지..
ld: 0706-006 라이브러리 파일 -l libinfoenc을(를) 찾거나 열 수 없습니다.
ld:open(): 경로 이름에 있는 파일이나 디렉토리가 존재하지 않습니다.
라이브러리 파일명은 libinfoenc.so 이고..
xlc -o test main.o -L/test -llibinfoenc
컴파일 명령어는 이렇게 줬습니다.
근데 이렇게 만든 so 파일을 사용 하려면 무엇을 해야 하는지..
긴급하게 부탁 드리겠습니다.
Forums:
LD_LIBRARY_PATH
를 등록 해도 마찬가지인데 방법 없을까요~?
xlc -o test main.o -L/test
xlc -o test main.o -L/test -linfoenc
가 아닐까 싶은데요.
LD_LIBRARY_PATH 는 링커가 아니라 로더가 참조합니다.
로더가 이것을 지원한다면 말이죠.
OTL
2가지 가능성이 있군요
1. /test가 존재하지 않는다.
=>/test가 아니라 ./test일 가능성이 없는지.
2. 컴파일러 버그다.
=> xlc -L/test -o test main.o -llibinfoenc
1,2번 다 해당될 수도 있겟군요
어떤 로더인지는 잘 모르겠지만....
library를 명시할때 어떤 경우에는 library이름 자체만을 명시하는 경우가 있습니다.
예) libpthread.so를 링크해야 할 경우
gcc ........ -lpthread
환경을 정확히 명시하지 않
으셔서 정확히 답해드리기 힘들군요.
(AIX4.3과 5L은 다릅니다.)
일단 라이브러리를 찾지못한다면 다음 두 경우일것 같습니다.
1. 라이브러리 이름을 .a로 바꾼다.
libinfoenc.so가 아니라 libinfoenc.a입니다. (shared라도 정적라이브러리처럼 .a 접미사를 가집니다.)
2. AIX4.3기준이면 LIBPATH 환경변수를 (LD_LIBRARY_PATH와 같다고 보시면 됩니다.) 셋팅해보십시오.
라이브러리자체가 문제라면 (특히 makec++sharedlib 같은 명령으로 만들게 되면)
dump -HTv libinfoenc.a
해당 library의 정보를 분석하실 필요가 있습니다. (32비트인지, 내장된오브젝트는 어떤것이고 심볼은 어떤것인지 등등)
homeless
모두 답변달아주셔셔 감사합니다.
정확한 OS는 AIX 5.3 64비트 버전입니다.
컴파일 하나에 5시간을 헤메이며 결국 ㅜ.ㅜ.. 리눅스에서 완벽히 테스트 해보고 갔지만...
역시 OS 무시할수는 없네요..
이후 진행 상황
OS버전 : AIX 5.3 64비트
진행 화면 :
$ xlc -c infoenc.c
$ xlc -o libinfoenc.so -qmkshrobj
$ xlc -o test main.c -L. -linfoenc
ld: 0706-006 라이브러리 파일 -l libinfoenc을(를) 찾거나 열 수 없습니다.
ld:open(): 경로 이름에 있는 파일이나 디렉토리가 존재하지 않습니다.
그래도 못 찾더라구요 ㅡㅜ
bushi :: xlc -o test main.o -L/test -linfoenc 물론 이명령으로 해봤지만.. 똑같은 오류가 나더라구요
harisoo :: 음... 그렇군요 ^^;
SoulreaveR :: 말씀하신대로 진행도 해보고 이름도 바꿔보고 LD_LIBRARY_PATH 에 등록을 해도 마찬가지더라구요..
kihlle :: .a 는 안해봤는데 해볼꺼 그랬나봐요;; 타업체의 경우 so로 잘 쓰신다고 해서.. ㅜ
4분 답변 감사합니다. ㅜㅜ
마무리는 못지었지만 아마도.. 장비를 임대 해서라도 원인분석하고 진행 할 것 같습니다.
날이라도 새야 할까나봐요 ㅜ
xlc 를 이용해서 shared
xlc 를 이용해서 shared object를 만드는 방식이 좀 틀립니다.
xlc -G -bM:SRE -bnoentry -o libinfoenc.so infoenc.o -bE:infoenc.exp
infoenc.exp 에는 shared object에서 export 할 함수명을 적어 주면 됩니다.
so가 성공적으로 생성되었는지 확인을 해보세요. 그리고 AIX는 LD_LIBRARY_PATH대신 LIBPATH를 참조합니다.
file libinfoenc.so
nm libinfoenc.so
ldd libinfoenc.so
---------
간디가 말한 우리를 파괴시키는 7가지 요소
첫째, 노동 없는 부(富)/둘째, 양심 없는 쾌락
셋째, 인격 없는 지! 식/넷째, 윤리 없는 비지니스
이익추구를 위해서라면..
다섯째, 인성(人性)없는 과학
여섯째, 희생 없는 종교/일곱째, 신념 없는 정치
---------
간디가 말한 우리를 파괴시키는 7가지 요소
첫째, 노동 없는 부(富)/둘째, 양심 없는 쾌락
셋째, 인격 없는 지! 식/넷째, 윤리 없는 비지니스
이익추구를 위해서라면..
다섯째, 인성(人性)없는 과학
여섯째, 희생 없는 종교/일곱째, 신념 없는 정치
IsExist님 말씀 감사합니다.
염치 불구 말씀 하신 내용중에 몇가지 질문 더 드릴꼐요;
1.
infoenc.exp 파일에
함수명을 적으시라고 하셨는데..
예를 들어 함수병이 abs라고 했을때
infoenc.exp 에 abs 만 적으면 되는건지요?
2. so가 성공적으로 생성 되었을 경우
file libinfoenc.so
nm libinfoenc.so
ldd libinfoenc.so
차례로 실행 하면 되는건지.. 알고 싶습니다.
해결 했습니다.
답변 달아주신분들 덕분에 해결 했어요 ^^;;
오늘 동일한 환경의 장비가 임대되어 와서 테스트 해보고
댓글 달러 왔습니다.
진행 내용
infoenc.c 에 해더 파일 없이 c안에 모든 파일이 다 있었는데..
함수병을 해더파일로 빼서 infoenc.c, infoenc.h 파일로 나누었습니다.
infoenc.exp 파일에 함수명을 따로 적었고
xlc -c infoenc.c 로 컴파일을 먼저 하였습니다.
xlc -G -bM:SRE -bnoentry -o libinfoenc.so infoenc.o -bE:infoenc.exp 컴파일 하여 Shared Lib 만들었고
file libinfoenc.so
nm libinfoenc.so
ldd libinfoenc.so
으로 확인 하였습니다.
마지막으로 테스트 소스 컴파일을
xlC -o test main.c -brtl -L. -linfoenc
이렇게 해주었습니다.
감사합니다 ^^
댓글 달기