2010-05-15 1 views
0

내가 포함하고있는 C++ 헤더에 정의 된 정적 클래스 Pipe가 있습니다.Objective-C/C++ - 링커 오류/메서드 서명 문제

static ERC SendUserGet(const UserId &_idUser,const GUID &_idStyle,const ZoneId &_idZone,const char *_pszMsg); 

나는 사용자 ID의 복사본을 저장하기 위해 나타나는 목표 - C 데이터 구조에 대한 액세스 권한을 가지고 있고, zoneID :

내가 (목표 - C에서) 호출에 관심이 있어요 정적 방법은 여기

@interface DataBlock : NSObject 
{ 
    GUID userID; 
    GUID zoneID; 
} 

데프 GUID를 보았다, 그리고 평등을위한 과부하 사업자의 무리와 함께 구조체입니다 : - 것 같습니다. 첫 번째 함수 서명의 UserId 및 ZoneId는 #typedef입니다. GUID

이제는 (const UserId), (UserId) 등 어떻게 캐스팅했는지에 관계없이 메서드를 호출하려고하면 다음과 같은 링커 오류가 발생합니다.

Ld build/Debug/Seeker.app/Contents/MacOS/Seeker normal i386 
cd /Users/josh/Development/project/Mac/Seeker 
setenv MACOSX_DEPLOYMENT_TARGET 10.5 
/Developer/usr/bin/g++-4.2 -arch i386 -isysroot /Developer/SDKs/MacOSX10.5.sdk -L/Users/josh/Development/TS/Mac/Seeker/build/Debug -L/Users/josh/Development/TS/Mac/Seeker/../../../debug -L/Developer/Platforms/iPhoneOS.platform/Developer/usr/lib/gcc/i686-apple-darwin10/4.2.1 -F/Users/josh/Development/TS/Mac/Seeker/build/Debug -filelist /Users/josh/Development/TS/Mac/Seeker/build/Seeker.build/Debug/Seeker.build/Objects-normal/i386/Seeker.LinkFileList -mmacosx-version-min=10.5 -framework Cocoa -framework WebKit -lSAPI -lSPL -o /Users/josh/Development/TS/Mac/Seeker/build/Debug/Seeker.app/Contents/MacOS/Seeker 

Undefined symbols: 
    "SocPipe::SendUserGet(_GUID const&, _GUID const&, _GUID const&, char const*)", referenced from: 
    -[PeoplePaneController clickGet:] in PeoplePaneController.o 
ld: symbol(s) not found 
collect2: ld returned 1 exit status 

이 유형/기능 서명 오류 또는 진정한 종류의 링커 오류입니까? 나는 모든 타입과 정적 클래스가 정의 된 헤더를 가지고 있습니다. #include도 마찬가지입니다. 나는 이미 넘어져 있습니다. P

용서 해주세요, 저는 웹 기술 배경에서 왔습니다. 그래서이 C 스타일의 메모리 관리 및 변경 불가능한 것들은 매우 흐릿합니다.

편집 : 전체 링커 오류 텍스트가 추가되었습니다. "function"을 "method"로 변경했습니다. 또한 우리는 커스텀 makefile을 사용하여이 프로젝트의 외부 프로젝트를 컴파일하는 중임을 주목할 것입니다. SocPipe 정적 메서드는이 xcode 프로젝트에서 다른 곳에서 참조되며 잘 컴파일 된 것처럼 보입니다.

+1

전체 링커 오류가 아닙니다. 붙여 넣기 전에 한 줄 또는 두 줄을 가져 가십시오. –

+0

또한,'SendUserGet'은 함수가 아니라, 정적 메소드입니다. 그것이 함수라면, 그것은'정적'으로 선언 되었기 때문에 링커 에러를 생성하지 않습니다. 예, '정적'은 클래스 정의의 내부 또는 외부에 표시되는지 여부에 따라 완전히 다른 것을 의미합니다. –

+0

그런 다음 방법. 편집 됨. – Josh

답변

1

(어,의는 대답으로 그 의견을 돌려 보자.)

방법 서명이 잘 보이는; 즉, 헤더에서 선언 된 내용과 일치하는 호출입니다. 그렇지 않은 경우 링커 오류가 아닌 컴파일 오류가 발생했을 수 있습니다. 이 방법은 을 선언하지만,을 정의하지 입니다 :

링커의 문제는이 전화를 연결하는 모든 해당 오브젝트 코드가없는 것입니다.

후자는 프로젝트에서 컴파일 할 수있는 C++ 소스 파일이나 링크 할 수있는 미리 컴파일 된 라이브러리 또는 프레임 워크에서 발생해야합니다. 어느 쪽이든, 링커가 사용할 수 있도록 프로젝트에 파일을 포함시켜야합니다.

+0

아. 도대체 내가 잘못한 것을 지적했다. 구현 (이론적으로 프로젝트에 포함됨)에는이 특정 블록이 컴파일되지 못하도록하는 ifdef가 있습니다. 아! 어쩌면 API에 내 요구를 충족시키는 다른 방법이있을 수 있습니다. 감사합니다. – Josh

+0

아, 좋아. 인터페이스가 깨지기 때문에 전체 메소드 구현이 # ifdef-ed되도록 상당히 비뚤어진 것으로 보입니다. – walkytalky

1

Pipe::SendUserGet을 포함하는 개체 파일이 작성되지 않았거나 Xcode 대상에 연결되어 있지 않습니다. Pipe의 다른 정적 메서드가 제대로 작동하는지 여부는 해당 메서드가 헤더 파일에 정의되어있는 경우 반드시 관련이 있습니다.

외부 메이크 파일을 사용하여 프로젝트의 일부분을 구성한다고 언급했습니다. 이 경우 makefile을 컴파일 타임에 의존성으로 실행하는 것만으로는 충분하지 않습니다. 결과 제품을 프로젝트에 포함시켜야합니다.

예를 들어, libLIBRARY.a을 빌드하는 메이크 파일이있는 경우 libLIBRARY.a을 프로젝트에 끌어와 대상에 추가하십시오.

이것은 메이크 파일이 라이브러리를 빌드하는 경우에만 작동합니다.makefile이 프로그램을 빌드하면 작동하지 않습니다. 또한 라이브러리가 동적 라이브러리 인 경우 더 복잡해집니다. 동적 라이브러리가 응용 프로그램과 함께 배포되도록해야합니다 (종종 응용 프로그램 번들을 만드는 경우 응용 프로그램 번들에 넣음) . 또한 유니버설 바이너리를 빌드하려는 경우 더 복잡해집니다. 이론적으로 올바른 CFLAGS를 make에 전달하여 범용 라이브러리를 구축 할 수 있지만 make을 각 아키텍처에 대해 한 번 실행하고 스크립트를 사용하여 결과를 결합하는 것이 더 쉽습니다.

+0

추가 정보를 보내 주셔서 감사합니다. 여기에 무슨 일이 일어 났을 것 같아요 (Win32에서 맥) 포팅의 서두에서,이 특정 구현은 TODO로 ifdef'd있어, 그리고 나서 그들은 내 머리를 때려 박히기 위해 헤더의 메소드 def를 남겼습니다. 후자! C/C++/objective-c를 알지 못하는 것에 대한 제 잘못으로 도대체 무슨 일이 벌어지고 있는지 알 수 있습니다. – Josh