2010-07-29 6 views
26

이전에는 객체와 라이브러리가 연결 단계에서 g ++에 전달 된 순서가 중요하지 않다고 항상 생각했습니다. 그런 다음 오늘은 C++ 코드에서 C 코드로 링크하려고했습니다. extern "C"블록에있는 모든 C 헤더를 래핑했지만 링커는 C 오브젝트 아카이브에있는 심볼을 찾는 데 어려움이있었습니다.g ++ c 코드를 C++ 코드에 연결할 때 순서 종속성을 사용합니다.

Perplexed, 난 연결 오류를 분리하는 비교적 간단한 예제를 만들었지 만, 놀랍게도, 어떤 문제없이 링크 된 간단한 예제입니다.

약간의 시행 착오 끝에 간단한 예제에서 사용한 연결 패턴을 에뮬레이션하여 주 코드가 정상적으로 연결될 수 있음을 알았습니다. 패턴은 오브젝트 코드는 첫 번째, 두 번째 예를 들어, 아카이브 오브젝트되었다

g++ -o serverCpp serverCpp.o algoC.o libcrypto.a

사람이 그렇게 할 이유에 도움이 되거 수를? 나는 일반적인 C++ 코드를 링크 할 때이 문제를 본 적이 없다.

+0

자세한 내용은 다음을 참조하십시오. http://stackoverflow.com/questions/1095298/gcc-c-linker-errors-undefined-reference -to-vtable-for-xxx-undefined-referencing/1095321 # 1095321 –

답변

35

오브젝트 파일과 라이브러리를 지정하는 순서는 GCC에서 매우 중요합니다. 매혹적인 삶을 살기 전에이 파일에 물리지 않은 경우입니다. 링커는 나타나는 순서대로 기호를 검색하므로 라이브러리 함수 호출이 포함 된 소스 파일이있는 경우 라이브러리 앞에 넣어야합니다. 그렇지 않으면 링커가 해결해야한다는 것을 알 수 없습니다. 라이브러리를 복잡하게 사용한다는 것은 라이브러리를 두 번 이상 지정해야한다는 것을 의미 할 수 있습니다. 이는 얻을 수있는 왕궁의 고통입니다.

+0

나를 믿어 라, 나는 :-),이 속성에 대한 문서가 있습니까? –

+0

여기에 우리가 간다 : http://www.network-theory.co.uk/docs/gccintro/gccintro_18.html –

+0

나는 또한 링크 명령이 항상 중요하다는 것을 알았다. 순서가 잘못되었다고 추측 할 때까지 링크 오류가 발생하는 이유를 알아내는 것은 어려울 수 있습니다. –

6

정적 라이브러리는 아카이브로 그룹화 된 개체 파일의 모음입니다. 링크 할 때 링커는 현재 정의되지 않은 심볼을 해결하는 데 필요한 객체 만 선택합니다. 오브젝트는 명령 행에 주어진 순서대로 링크되기 때문에 라이브러리가 종속 된 모든 오브젝트 다음에 라이브러리가있는 경우에만 라이브러리의 오브젝트가 포함됩니다.

링크 순서는 매우 중요합니다. 정적 라이브러리를 사용하려는 경우 종속성을 추적하고 라이브러리간에 순환 종속성을 도입하지 않도록주의해야합니다.

+0

순환 종속성은 정상입니다. 즉, 다음과 같은 링크 행이 필요하다는 것을 의미합니다. "ao bo ao'." – caf

+1

@caf : 두 번째로 'a'를 포함하는 추가 객체가 아직 포함되지 않은 'b'의 객체에 의존하면 충분하지 않습니다. 마지막에'b'를 다시 추가해야합니다. 차례 차례로'a '에 의존성을 더 도입 할 수 있습니다. 그래서주기적인 의존성은 실제로 "OK"가 아니며, 반복적으로 두 번 이상 필요로하는 병리학 적 증상을 보이는 경우는 거의 없습니다. –

17

gcc/g ++에 대한 라이브러리 순서가 실제로 중요합니다. AB에 의존하는 경우 A가 먼저 나열되어야합니다. 그 이유는 참조되지 않은 심볼을 최적화하기 때문입니다. 따라서 라이브러리 B이 먼저 보이고 아무도 그 시점에서 아무 것도 참조하지 않았다면 아무 것도 전혀 링크하지 않습니다.

0

당신은 --start 그룹 아카이브 --end 그룹 을 사용하고 아카이브

GCC main.o를 -L 대신이 종속 라이브러리를 작성할 수 있습니다. -Wl, - 시작 그룹 -lobj_A -lobj_b -Wl, - 최종 그룹

관련 문제