2015-02-05 2 views
1

기본 프로젝트에 ClassA라는 클래스가 있고이 하위 프로젝트에 ClassA라는 클래스 이름의 정적 라이브러리 용으로 작성된 하위 프로젝트가있는 경우 컴파일러가 두 클래스를 구별하는 방법을 성공적으로 빌드하고 실행할 수 있는지 궁금합니다.라이브러리 및 프로젝트의 동일한 클래스 이름

+4

라이브러리의 클래스는 UIView, NSMutableArray 등과 같이 무언가로 미리 작성되어야합니다. 이렇게하면 충돌을 피할 수 있습니다. – Fonix

답변

2

저는 링커가 어떻게 작동하는지에 대해 이야기하고 있다고 생각합니다.

정적 라이브러리는 확장명이 ".o"인 여러 재배치 가능 객체 파일의 모음입니다. 프로젝트의 소스 파일도 재배치 가능한 객체 파일로 컴파일됩니다.

링커가 작동하면 코드에 사용 된 ClassA과 같은 기호가 해결됩니다. 재배치 가능한 객체 파일에서 발견 된 경우 - rof1.o이라고 가정 해 봅시다. rof1.o을 실행 파일에 흡수합니다. 링커가 심볼 해석을 시도 할 때 재배치 가능한 객체 파일의 검색 순서에 따라 ClassA이 사용됩니다. 검색 순서는 우리에게 결정적이지 않기 때문에 다른 클래스 이름을 사용해야합니다.

다른 링크 플래그를 '-all_load'로 설정하면 링커가 모든 재배치 가능 객체 파일을 실행 파일로 결합하려고 시도한다는 것을 나타냅니다. 그런 다음 두 개 이상의 동일한 기호가 있으면 "중복 된 기호"오류가 표시됩니다.

+0

기본 검색 순서는 Project> Static library입니다. 맞습니까? – riyousan

+0

@riyousan 그것은 시험의 몇 시간에 따라 그런 것처럼 보이지만 결코 그것에 의존하지 마십시오. – KudoCC

+0

데모에서 테스트 한 결과 그 추측을 확인했지만, 당신이 맞다고 말하면, 우리는 그것에 의존 할 수 없습니다. 감사합니다. ELF에 관한 몇 가지 논문을 읽어야한다고 생각합니다. 답은 저에게 매우 귀중합니다. – riyousan

1

클래스 중 하나의 이름을 변경해야합니다. 그렇지 않으면 컴파일러에서 코드를 작성할 때 오류가 발생합니다.

관련 문제