2012-03-08 1 views
0

QNX/ARM에 대한 간단한 프로젝트를 컴파일하려고합니다.이 프로젝트는 기본 실행 파일과 두 개의 공유 라이브러리 인 liba 및 libb로 구성됩니다.ARM/QNX에 대한 상호 연결이 간접/이행 종속성과 함께 실패합니다

메인은 liba에만 의존하고 libb에서는 전혀 사용하지 않습니다. liba는 libb에 의존합니다. 종속성 체인은 main -> liba -> libb입니다. 따라서 libb는 main의 간접/이행 종속성입니다. liba.so는 liba/서브 디렉토리에 있으며, libb.so는 libb/서브 디렉토리에 있습니다. 두 -L 라인, 링커가 문제 libb 및 LIBA 모두를 찾는데 어려움이 없어야하기 때문에,

qcc -Vgcc_ntoarmv7le -Wl,--no-undefined -lang-c++ -o linktest main.o -L$TARGET/lib -Llibb -Lliba -la 

당신이 볼 수 있듯이 :

나는 다음과 같은 방법을 주요 연결합니다. 이것은 -L로 지정에도 불구하고

ntoarm-ld: warning: libb.so, needed by liba/liba.so, not found (try using -rpath or -rpath-link) 

strace를 사용하는 것은, LD 결코 심지어 libb/디렉토리에 보이는 것을 확인 : 나는 QNX/ARM 툴체인과 함께이를 컴파일 할 때

, 나는 오류가 발생합니다.

왜 여기에 -L 디렉토리가 보이지 않습니까?

+0

IRC에서이 동작은 사용 된 링커에 따라 다르다고 들었는데 일부는 간접적 인 종속성을 자동으로 가져 오지만 일부는 그렇지 않습니다. ld가 -L 경로를 완전히 무시하는 이유를 알고 싶습니다. –

답변

0

-lb가 없습니다. L은 경로를 지정하고 l은 실제 라이브러리를 지정합니다. 빌드 명령의 끝에서 -lb을 추가

qcc -Vgcc_ntoarmv7le -Wl,--no-undefined -lang-c++ -o linktest main.o \ 
-L$TARGET/lib -Llibb -Lliba -la -lb 

을 당신이 빌드 타임 의존성을 제거 dlopen()를 사용 LIBA 에서 실행 dynamic loading를 통해 libb 사용을 고려하십시오.

UPDATE : 지적

tmcguire 으로 공유 라이브러리에 대한 간접적 인 연결의 행동이 링커에 링커 다릅니다. ? this article에 따르면, 책임 ld 옵션 --no-copy-dt-needed-entries이다 (가끔 최신 gcc 자료 (> 4.5)에 기본적으로 사용되는, --no-add-needed라고

또 다른 흥미로운 옵션은 --as-needed이다.

The --as-needed flag is passed to the GNU linker (GNU ld). The flag tells the linker to link in the produced binary only the libraries containing symbols actually used by the binary itself. This binary can be either a final executable or another library.

추가 독서가 here입니다 , here.

+0

예, -lb를 지정하지 않았습니다. 간접적 인 종속성 때문입니다. 나는 링커가 liba가 libb에 의존하고 따라서 libb를 자동으로 추출한다는 것을 알아낼 것이라고 생각했다. 나는 lb가 libb.so를 찾을 수 없다는 것을 경고하고, libb.so를 찾을 수 없다는 것을 경고하므로 libb를 찾을 필요가 있다는 것을 알려주는 -L을 무시한다. –