2011-11-04 7 views
4

우리는 다음과 같이 조직 된 C/C++ 프로젝트가 있습니다.중첩 cmake 라이브러리

변경 : 우리는 log.c/some-func-2에서 함수 foo.c/some-func에서 를 호출 할 수 없습니다. 링커는 이러한 함수가 정의되지 않았다고 불평하고 있습니다.

+0

* 컴파일러 * 또는 링커 *가 불평합니까? 컴파일러라면 foo.c 파일에 log.h를 # 포함 시켰습니까? – Vicky

+0

링커이기 때문에 컴파일러는 쉽게 수정할 수 있습니다. – Cartesius00

+0

하위 라이브러리를 정적 또는 공유 라이브러리로 구축하고 있습니까? 하위 라이브러리가 맨 위 라이브러리에 링크하는 데만 사용되면 (최상위 라이브러리가 공유되는 경우) 하위 라이브러리를 정적 라이브러리 ('libxxx.so' 대신에'libxxx.a')로 만든 다음 하위 라이브러리를 연결하지 않습니다. –

답변

1

링크 명령에 라이브러리 및 오브젝트 파일이 나타나는 순서는 중요하며 정의되지 않은 기호에 문제가 발생할 수 있습니다. 게시물에 많은 정보를 제공하지 않지만 모든 라이브러리를 그룹으로 처리하도록 링커에 알려주십시오. 마찬가지로 : 링커 문서에서

--start-group <all your libs> --end-group 

:

일반적으로 아카이브는 명령 줄에 지정된 순서대로 한 번만 검색됩니다. 해당 아카이브의 심볼이 나중에 명령 줄에 나타나는 아카이브에서 객체가 참조하는 정의되지 않은 심볼을 해결해야하는 경우 링커는 해당 참조를 해결할 수 없습니다. 아카이브를 그룹화하여 가능한 모든 참조가 해결 될 때까지 반복적으로 검색합니다. 이 옵션을 사용하면 상당한 성능 비용이 발생합니다. 두 개 이상의 아카이브간에 피할 수없는 순환 참조가있는 경우에만 사용하는 것이 가장 좋습니다.