2016-09-20 1 views
0

나는 생성 과정이 나에 의해 통제되지 않으며 그 출처도없는 .a 파일들을 가지고있다. 연결에 사용할 때 libA.alibA.a에 정의되지 않은 기호가 있지만 libB.a에 정의 된 기호가있는 경우 libB.a에 따라 달라 지므로 ld/gcc 명령 줄에 올바른 순서로 넣을 수 있습니다.두 개의 Linux 정적 라이브러리가 주어지면, 하나가 다른 라이브러리에 의존하는지 어떻게 알 수 있습니까?

이러한 종속성을 BUILD 파일 bazel에 유지하고자하기 때문에 링크를 두 번 지정하지 마십시오. 즉, 해당 종속성을 알고 싶습니다.

나는 libA.a 주어 libB.alibA.alibB.a에 따라 달라집니다 여부를 말할 수있는 몇 가지 명령 줄 도구가 있는지 궁금해? 그러한 스크립트가 없으면 어떻게 그런 스크립트를 작성합니까?

참고 : 의존성에 대한 나의 정의는 100 % 정확하지 않을 수 있습니다. 정의되거나 정의되지 않은 기호 이외의 다른 유형의 종속성이 있으면 알려주십시오.

가장 간단한 방법은 nm libA.anm libB.a의 출력을 처리하고 U 상징을 찾는 것입니다,하지만 man nm에 나열된 문자의 많은 유형이 그들 각각은 서로 다른 의미를 가지고있다, 그래서 내가 경우 몇 가지를 놓칠 수도 걱정 I 그러한 단순화 된 접근 방식을 사용하십시오.

+0

정적 라이브러리는 최종의 다른 lib 디렉토리에 의존하지 않습니다. –

+0

@IporSircer, 그들은'.so' 파일과 같은 파일 형식으로 인코딩 된 의존성을 가지고 있지 않지만 의존성을 가지고 있습니다. 'libA.a'가'libB.a'에 의존한다면,'ld'에서 명령 행'libA.a'가'libb.a' 앞에 놓여 져야합니다. 왜냐하면'ld'가 작동하기 때문입니다. –

답변

0

U 기호로 시작하는 접근 방식을 사용합니다. 실제로는 대문자 인 심볼 유형 만 있으면됩니다.이 심볼 유형은 관련 링크입니다. 나는 수출입 문자를 인쇄하는 스크립트를 작성하고,이 경우에, LIBA는 "libB에서 기호 (목록이 너무 comm이 있어야 분류되어 있습니다를 사용하는 것이 어디

exports libB.a >libB-exports 
externs libA.a >libA-externs 
comm libB-exports libA-externs >libA-needs-libB 

심볼을 나열 할 충분하다 그냥 일이야"). 공유 라이브러리 인 경우 스크립트를 수정해야합니다 (nm에`-D 옵션 추가).

추가 읽기 :

관련 문제