라이브러리 크로스컴파일 질문있습니다.
upstart를 크로스컴파일해서 arm보드에 넣고있는데요
upstart를 크로스컴파일할려면
libnih, dbus, expat등 여러가지 부속라이브러리들이 필요하던데
원래 돌아가고있는 /sbin/init을 ldd명령어로보면
ldd /sbin/init
libnih.so.1 => /lib/arm-linux-gnueabihf/libnih.so.1 (0x4022c000)
libnih-dbus.so.1 => /lib/arm-linux-gnueabihf/libnih-dbus.so.1 (0x40022000)
libdbus-1.so.3 => /lib/arm-linux-gnueabihf/libdbus-1.so.3 (0x40077000)
libpthread.so.0 => /lib/arm-linux-gnueabihf/libpthread.so.0 (0x400e5000)
librt.so.1 => /lib/arm-linux-gnueabihf/librt.so.1 (0x400a8000)
libc.so.6 => /lib/arm-linux-gnueabihf/libc.so.6 (0x40245000)
/lib/ld-linux-armhf.so.3 (0x400c5000)
이렇습니다
그런데 제가 크로스컴파일한 /sbin/init을 타겟보드에서보면
libnih.so.1 => /lib/arm-linux-gnueabihf/libnih.so.1 (0x4022c000)
libnih-dbus.so.1 => /lib/arm-linux-gnueabihf/libnih-dbus.so.1 (0x40022000)
libdbus-1.so.3 => /lib/arm-linux-gnueabihf/libdbus-1.so.3 (0x40077000)
위의 3개의 라이브러리는 ldd명령어로 나오지않습니다.
--prefix 경로를 타겟보드 파일시스템경로로하여 설치도 하였습니다
라이브러리를 크로스컴파일할때 각별히 신경써야하는 부분이 있는건가요??
라이브러리를 컴파일하니 이상하게도 /lib 디렉토리에 .so 파일로 install 되는게 아니라 .la파일로 인스톨되고...
크로스컴파일한 upstart init도 동작을 안하고... upstart init이 동작을 안하는 이유가 위의 3개의 라이브러리가 ldd로 보앗을시 링크가안되어서 그런것 같기도하고..
라이브러리를 크로스컴파일 할시 중요시할 사항ㅇ ㅣ있나요...?
의견.
> 위의 3개의 라이브러리는 ldd명령어로 나오지않습니다.
제가 Upstart 을 컴파일해 보지 않았습니다.
일반적인 경우로 보면, 패키지를 크로스 컴파일 할 때 다음 두가지를 확인해야합니다.
#1 configure에 설정에서 옵션을 제대로 주었지, 혹지 default 가정하고 진행나는 것은 아닌지.
예를 들어서 DBUS옵션이 default가 아니어서 예를 들면 -DDBUS 혹은 --with-dbus 이런식으로 해야되는 경우.
#2 autoconf or configure에서 스스로 패키지 의존성 검사에 실패한 경우
위의 3개 라이브러가 path에서 발견이 안되서 생략하고 이미지를 만들 수 있습니다.
이 것은 연속적으로 계속 이어 질수 있습니다. A가 없어서확인했는데, A는 B가 없어 못했고, 다시 B-> C.. 등등.
> 라이브러리를 컴파일하니 이상하게도 /lib 디렉토리에 .so 파일로 install 되는게 아니라 .la파일로 인스톨되고...
.la을 libtool 의 결과물입니다. 실제 사용중인 컴파일 시스템의 라이브리 의존성(솔라리스유닉스/리눅스)의 확인 후에
각각 시스템에 맞는 static 혹은 dynamic library를 만드는 dependency 파일을 만듭니다. 이게 *.la 파일입니다.
이 .la 파일이 타켓 Install 된다는 것은 몇 가지 경우가 있습니다.
#1 패키지에 포함된 install 커맨드를 제대로 호출하지 않은 경우
실제 커맨드는 "make install-exec" 인데 가령 "make install" 으로 잘못호출하는 경우.
#2 커맨드는 호출되었는데, Target Rule에
rm -f *.la 이런 명령어가 없는 경우...
그냥 지우면됩니다.
답변 감사합니다.단순하게 한개의 파일만
답변 감사합니다.단순하게 한개의 파일만 크로스컴파일하는거면 쉬울텐데
A를 컴파일하기위해서는 B... B를 하기위해서는 C.... ㄲ리에 꼬리르 무니 참어려운거같네요 ㅠ
이상하게도 제 host-pc에는 libtool이 깔려져있지 않은상황이었습니다.
의견이라고 답글을 달아주셧는데 저에게는 아주많은 도움이 되었습니다. 성공적으로 크로스컴파일하면 답글 또 드리겠습니다 감사합니다.
하나 더.
예를 들어,
크로스 컴파일하는 Application이 의존하는 라이브러리(직접 혹간접 호출) 통하여 대략 10개가 넘어가고, 그리고 그러한 라이브러니 하나 하나가 크기가 작지 않은 경우가 있습니다.
(여기서 10개는 그냥 제 개인적인 기준입니다.)
이런 경우에는 마음을 비우시고 autoconf/automake/libtool을 처음부터 크로스 컴파일 환경 위해 "전용"으로 만들고 하나 하나씩 빌딩하는 것이 좋습니다. 그렇지 않고 Host용 autoconf/automake/libtool을 Target용으로 혼용해서 사용하면 나중에 관리가 어렵고 갈 수록 꼬입니다.
예를 들면 Make install & Make install --prefix등 막 혼용해서 사용 경우까지 이를 수 있습니다.
댓글 달기