2009-11-18 3 views
2

저는 C++과 gcc와 관련된 모든 것에 초보자이기 때문에 잠재적으로 중요한 것을 이해해야합니다.XCode 및 iPhone SDK : C++ 표준 라이브러리 유형?

"___gxx_personality_v0"에서 참조 : 나는 동적에서 C++ 표준 라이브러리 유형을 변경하는 경우

(기본 내가 출력이 새로운 아이폰 프로젝트에 파일을 .mm 사용하는 경우이 오류 정적 LIB 얻을 수있다) 정적 오류가 사라집니다. SDK의 제한 사항입니까? 동적 라이브러리에서 Obj-C++ 확장을 활성화 할 수 있습니까? 나는 초심자이고 내가 여기서 말하는 것에 대해서만 모조하는 것을 명심하십시오. 또한 이러한 설정 간의 차이점을 알고 싶으면 변경하는 것이 잠재적으로 부정적인 영향을 미치는지 알고 싶습니다. 동적 라이브러리가 빌드시 최종 바이너리에 정적 라이브러리가 링크되는 동안 런타임시로드된다는 점에서 제 가정은 정확합니까? 그렇다면 왜 iPhone SDK가 동적 라이브러리를 만들 수 있습니까? iPhone에 타사 라이브러리를 설치하여 앱간에 공유 할 수는 없습니다.

업데이트 몇 명의 사람들이 응답했으며 답변에 감사드립니다. 그러나 나는 원래의 질문에서 오해 된 것처럼 보이는 것을 명확히하고 싶다. 파일 형식을 ".m"에서 ".mm"으로 바꾸는 것이 대답이 아니라 예외를 유발 한 것입니다. 상황은 이것입니다. ".mm"확장자를 가진 Obj-C++ 파일을 사용하는 iPhone 용 정적 라이브러리를 개발하십시오. 그런 다음 iPhone 응용 프로그램 (또는 단원 테스트 스위트)에서이 라이브러리를 사용하십시오. 클라이언트 대상이 기본값 인 "동적"대신 "정적"을 사용하도록 전환되지 않으면 Std C++ 라이브러리 유형에이 오류가 표시됩니다. 원래이 설정을 변경하여 미묘한 오류가 발생할 수 있다고 생각했지만 차이점을 이해하고 기본값이 일반적인 사용 사례와 반대되는 방식으로 설정된 이유는 무엇입니까?

답변

0

* .m은 Obj-C 확장입니다.
* .M은 Obj-C++ 확장입니다.

링크 할 때 컴파일러가 C++ 표준 라이브러리를 사용하도록 파일 이름을 바꿉니다.

+0

내 파일의 이름을 바꾸어 오류의 원인을 찾았습니다. 나는 ".m"을 Obj-C++에 사용합니다.하지만 ".M"도 사용할 수 있다고 들었습니다. 내 문제는 std C++ 라이브러리 유형에 대해 "정적"을 사용하여 영향을받는 대상이 무엇인지 모르겠다는 것입니다. 나는 또한 디폴트가 dynamic으로 설정된 이유를 이해하지 못한다. – Cliff

+0

OS와 함께 출시 된 최신 버전을 사용하도록 동적으로 설정됩니다. 정적으로 링크하면 앱이 항상 최신 버전과 동일한 버전을 사용하게됩니다. 또한 여러 응용 프로그램이 동일한 코드를 공유 할 수 있으므로 OS가 더 효율적입니다. –

+0

C++ 코드에 대해 객관적인 C++ ro 링크를 사용하는 코드에 .m 파일을 사용하지 마십시오. 이것은 당신이 발견 한 링커 문제로 이어질 것입니다. –

2

마틴 요크는 잘못된 컴파일러로 컴파일하는 것이 맞지만 OSX의 기본 파일 시스템은 대소 문자를 구분하지 않으므로 일반적으로 ".M"을 사용하여 실제로 Obj-C++를 나타낼 수 없습니다. Obj-C 파일의 이름을 .m으로 지정하고 Obj-C++ 파일의 이름을 .mm으로 지정해야합니다.

.m 파일에 Obj-C++을 사용할 수는 없지만 .m 파일과 C++ 코드를 확실히 연결할 수 있습니다. 동일한 프로젝트에서 Obj-C, Obj-C++ 및 C++을 혼합해도 문제는 없습니다. 그냥 당신이 당신이 바로 그 컴파일러를 사용하도록 올바르게 파일 이름 : -의 Obj-C

  • mm -의 Obj-C++
  • CPP -

    • m를 C++

    당신이 올바른지 당신은 할 수 없습니다 런타임시 iPhone에서 개인용 동적 라이브러리를로드하십시오. Xcode는 두 가지 이유로 Mac을 허용합니다. Mac은 동적 라이브러리를 허용하므로 SDK를 기반으로 IDE에 특수 사례 코드가있는 것이 고통스럽고 Apple 개발자는 iPhone에서 동적 라이브러리를 만들거나 할 수 있습니다. 그래서 Xcode는 그것을 금지하지 않습니다; 그들은 단지 당신에게 그것을위한 템플릿을주지 않습니다. XCode에서

  • +0

    Mac 및 iPhone의 동적 라이브러리를위한 장소가 있다는 것을 알고 있습니다. 내 질문은 왜 아이폰 프로젝트 템플릿에서 "동적"으로 설정된 기본값입니까? 이는 도서관이 iPhone 용으로 개발 된 방식임을 의미합니다. 그렇다면 아이폰 용 정적 라이브러리를 사용할 때 어떤 영향이 있을까요? – Cliff

    +0

    기본적으로 동적으로 설정 한 적이 없습니다. 대상이나 프로젝트를 만들 때 정적 라이브러리 템플릿을 사용 했습니까? 정적으로 설정해야합니다. iPhone 용 동적 라이브러리를 만들면 안됩니다. 그러나 시스템 동적 라이브러리와 링크해야합니다. 정적 라이브러리는 최종 바이너리에 직접 링크된다는 의미입니다. 마지막에는 오직 하나의 바이너리 파일 만있을 것입니다. no .a가 전화로 복사됩니다. –

    0

    >ARC으로 사용하고 Test target에, 나는 .mm 확장자를 가진 파일이 오류 ___gxx_personality_v0을 얻었다. .mm에서 .m 확장자로 파일의 이름을 변경했을 때 문제가 해결되었습니다.

    +0

    파일 이름을'.mm'에서'.m'으로 바꾼다는 것은 결과가 될 것입니다. 그렇지 않으면 왜 처음에 그 확장자를 가지고 있었습니까? – trojanfoe

    +0

    그들은 c/cpp와 objc 코드가 혼합되어 있습니다. 예, c/cpp 코드 조합을 모두 제거해야합니다. .m을 사용하면 objc 코드 만 가져야합니다. – karim