2009-12-13 2 views
1

두 개의 오브젝트 파일 모두 심볼 (기능) "foobar"를 정의하고 있습니다.두 개의 오브젝트 파일을 공통 심볼로 연결

명령 줄 호출에서 제공하는 obj 파일 순서를 따르고 항상 첫 번째 파일에서 심볼을 가져오고 나중에는 가져 오지 않도록 링커에 알릴 수 있습니까?

AFAIK "weak"pragma는 공유 라이브러리에서만 작동하지만 오브젝트 파일에서는 작동하지 않습니다.

나는 flexibel 때문에 알고있는 많은 C/C++ 컴파일러/링커/운영 체제 조합에 대해 답하고 많은 컴파일 (sun studio, intel, msvc, gcc, acc)을 사용하십시오.

답변

2

두 번째 개체 파일에서 정적 라이브러리를 만든 다음 첫 번째 개체 파일과 라이브러리를 연결해야한다고 생각합니다. 심볼이 객체 파일에 의해 해결되면 링커는 라이브러리에서 해당 심볼을 검색하지 않습니다.

또는 두 개체 파일을 별도의 정적 라이브러리에 배치하면 링크 순서가 명령 줄에서 해당 순서에 따라 결정됩니다.

개체 파일에서 정적 라이브러리를 만드는 것은 도구 체인에 따라 다릅니다. GCC에서는 ar 유틸리티를 사용하고 MSVC lib.exe는 정적 라이브러리 프로젝트 마법사를 사용합니다.

+0

오류가보고 같은 기호가 1.o' '에 정의되어있을 것이며, '2.o' (둘 다'libsome.a'에 있습니다),이 라이브러리에 대해 정적으로 링크하려고합니다. –

+0

@dmak_k : 잘 모르겠습니다. 왜 그런 짓을 한거야? 두 가지 일이 발생할 수 있습니다. 1) 링커는 정의를 모두 찾고 오류를보고 할 수 있습니다. 2) 발견 된 첫 번째 기호로 기호를 해석 할 수 있습니다.이 경우 오브젝트 파일이 라이브러리에 표시된 순서에 따라 달라집니다. 대부분의 경우 (2)가 모호하고 버그를 찾기가 어려울 수 있으므로 (1)을 원합니다. 물론 시도해 볼 수 있습니다. – Clifford

2

위험이 있습니다. 여기서 키워드는 삽입 위치 종속 코드입니다. 당신이 malloc라는 사용자 지정 루틴을 작성했습니다 가정하면

:

내가 당신에게 여기 예를 들어 보겠습니다. 표준 라이브러리에서 링크하면 어떤 일이 발생합니까? malloc (표준 함수)을 사용해야하는 함수는 사용자 정의 버전을 사용할 것이고 최종 결과는 의도하지 않은 부작용 및 무언가가 나타날 때 코드가 불안정해질 수 있습니다. '부서진'.

이것은 염두에 두어야 할 사항입니다.

귀하의 경우와 마찬가지로 다른 기능을 '덮어 쓰기'(나는 따옴표를 사용하여 강조) 할 수 있지만 어떤 경우에 foobar이 사용되고 있는지 어떻게 알 수 있습니까? 이것은 어떤 foobar이 호출되는지 알아 내려고 할 때 디버깅 슬픔으로 이어질 수 있습니다.

호프가 도움이 되었으면 안녕하세요, 탐.

0

당신은 운영자와 파일로 만들 수는 ... 그리고 컴파일러가 심볼을 얻고, 나중에 어린이 침대하지 않습니다

관련 문제