2009-09-14 5 views
4

나는 우리는 델파이 파일 세트 (.pas) 이러한 .pas 파일에서 생성 된 C++ 빌더 파일 (.hpp.obj)의 설정이 C++ 빌더 2009의 링커ILINK32 오류의 원인 : XXX.obj에서 참조 된 해결되지 않은 외부 '__fastcall 시스템 :: TObject :: NewInstance (System :: TMetaClass *)'?

Unresolved external '__fastcall System::TObject::NewInstance(System::TMetaClass *)' referenced from XXX.obj? 

에서 다음과 같은 오류를 얻고있다.

파일 집합이 다른 컴퓨터에 복사됩니다. 두 시스템 모두 동일한 업데이트 (최신 : 3 + 4)가 설치된 C++ 빌더 2009 버전이 동일합니다.

다른 컴퓨터의 C++ Builder에서 비어있는 VCL 응용 프로그램을 만들고이 집합의 하나의 obj 파일을 활성 프로젝트에 포함하면 위의 링크 단계에서 오류가 발생합니다. 이 오류에 대한

이상한 일들은 다음과 같습니다

  1. 이 오류가없는 모든 컴퓨터 또는 C++ Builder를 설치 (I 그들 중 적어도 5 확인했습니다)에 재현 할 수 있습니다.
  2. obj-file을 제거하고 해당 pas 파일을 프로젝트에 추가하면 오류가 사라집니다.
  3. 하지만 pas 파일을 제거하고 obj 파일을 다시 포함하면 오류가 발생하지 않습니다.
  4. 프로세스에서 pas 파일의 obj가 수정되지 않습니다. 나는. 이 파일 세트를 컴퓨터에서 삭제하고 첫 번째 컴퓨터에서 다시 가져온 경우 (생성 된 위치) 다시 오류가 발생하지 않습니다.
  5. 특정 컴퓨터에서 해당 시퀀스를 수행하면 (프로젝트에서 include/exclude pas 파일) - 폴더간에 파일을 이동하거나 설정을 사용하여 재생할 때마다 더 이상이 컴퓨터에서이 오류가 발생하지 않습니다. , 등). 실제로, 나는 이미이 오류를 재현 할 수있는 기계가 없습니다. (

나는 "보이지 않는"상황 "after"가 "before"(pas-file 포함 /) 오류가 보이기 전과 후에 만 ​​볼 수 있습니다.

인터넷에서이 오류 (또는 비슷한 오류)의 유일한 언급은 this입니다. 그러나 해결책은 없습니다. "+"문자가 없습니다. 경로 또는 공백 ("")

현재 뭔가가 누락 되었습니까? 지금 C++ Builder 버그입니다.

P. .hpp.obj (아니요 .pas 파일) 만 특정 시스템에 배포해야하므로 "pas 파일 만 포함"솔루션을 사용할 수 없습니다.

답변

0

오케이, 내가 대답을 찾았습니다 : 이유는 잘못된 IDE 또는 프로젝트 설정이었습니다 (확실하지 않습니다).

여러 버전의 C++ 빌더 및 Delphis가 설치되어 있습니다. 그리고 어떤 이유에서 C++ Builder의 2009 링커는 다른 obj 파일 (다른 버전 (2007 년 가능)에 사용해야하는 파일)을 선택했습니다.

오류에 대한 이유는, newInstance와 2007 년과 2009 버전 사이에 변경된 것이 었습니다

- 여기 참조 : https://forums.codegear.com/thread.jspa?messageID=161105

+0

이 답변의 링크가 깨졌습니다. 실제 답변이 답변에 포함되어 있고 링크 된 경우가 아니라면 좋았을 것입니다. – HappyCoding

0

pas 파일에서 프로젝트를 빌드하면 '__fastcall System :: TObject :: NewInstance (System :: TMetaClass *)'함수의 복사본이 obj 파일이 아닌 어딘가에 정의되어있는 것처럼 보입니다. , 바이너리에 링크되어있다. 함수가 정의되면 XXX.obj 파일이 함수를 찾습니다. 따라서 현재 obj 파일을 삭제하고 다른 컴퓨터에서 obj 파일을 가져 오는 경우 오류가 표시되지 않습니다. 이것은 내 생각에 불과합니다. 필자는 Delphi에 대해 전혀 알지 못하고 pas 파일이나 C++ Builder에 대해 전혀 알지 못합니다.

프로젝트에서 System :: TObject :: NewInstance() 함수가 정의되어 있고 이진 파일에 링크되어있는 dll 또는 일종의 외부 라이브러리를 만들고 있습니까?

+0

System :: TObject :: NewInstance는 항상 응용 프로그램에 링크되어있는 응용 프로그램 RTL의 일부입니다. 나는. 그것은 구현되지 않을 수 없다. 프로젝트는 DLL이나 패키지가 아니며 일반적인 VCL (즉, Win32) GUI 응용 프로그램입니다. 우리의 코드에는 빌드 인 RTL 함수를 재정의하는 것과 같은 것이 없습니다. – Alex

1

나는이 오류가 발생했지만, 난이 정의 있었기 때문에 그것이 :

virtual void getMaxSafeSpace(); 

보다는 :

virtual void getMaxSafeSpace()=0; 

내 추상 클래스입니다.

관련 문제