2011-04-12 2 views
1

때로는 makefile 안에 특정 순서로 libs를 나열하지 않으면 실패합니다.lib 의존성과 그들의 순서

이유는 - 정의가 사용되기 전에 나와야합니다.

올바른 순서를 결정하는 방법은 무엇입니까?

답변

3

실제로 라이브러리를 연결할 때 정의를 사용하기 전에 사용해야합니다. 정의되지 않은 기호는 정의를 제공하는 라이브러리 파일이 처리되기 전에 알려야합니다.

주문과 관련하여 수동으로해야 할 일이 있습니다. libA가 libB에 따라 다르면 (예 : libA가 libB의 기호를 사용함)이 순서대로 연결해야합니다 (-lA -lB).

이것은 대부분 문서화의 문제입니다. 잘 문서화 된 라이브러리는 그것이 의존하는 다른 라이브러리가 무엇인지 명확히 밝히고 있으므로 올바른 연결 순서를 알아낼 수 있습니다. 당신이 문서를 읽을 수 없다거나 사용 가능한 문서가없는 경우

는 시행 착오는 항상 내가이 너무 성가신 것으로 판명 옵션 :

+0

감사합니다. 이것이 내가 당신에게 말하는 마법이 없다는 것을 확인하고 싶습니다. – hari

1

입니다. 나는 나를 위해 정렬을 할 수있는 도구를 찾은 것을 기억하지만 도움이 될만한 것을 찾지 못했습니다.

마지막으로 나는 무차별 대입 방식을 사용하기로 결정했습니다. 모든 라이브러리를 두 번 나열하면 -lA -lB -lA -lB 일 경우, 모든 라이브러리가 다른 모든 라이브러리 전후에 나열되도록 보장합니다.

$(LIST) 개의 라이브러리가 있다면 $(addprefix -l,$(LIST) $(LIST))을 사용할 수 있습니다.

매우 우아하지는 않지만 연결 단계가 다소 느려지지만 작동합니다.

+0

Hummm, 고마워요.하지만 15 개의 라이브러리가 있다면 * UGLY *를 얻을 수있는이 접근법을 알고 있습니다 : D – hari

+0

@hari :'--start-group'과'--end-group' 옵션을 사용할 수 있습니다. ('및'-)')을 반복적으로 사용하지 않도록합니다. [binutils 매뉴얼] (http://sourceware.org/binutils/docs-2.21/ld/Options.html)에 따르면 이는 상당한 성능 비용을 초래합니다. – eriktous

+0

@eriktous : 예, 궁극적으로 누군가는 반복이 일어나지 않도록해야합니다. – hari