2012-06-14 2 views
2

볼랜드 C++ 빌더 V5.5로 C++ 프로그램을 빌드하려고합니다. 까지는 모든 것이 잘 작동합니다. c 파일에 정의 된 함수를 호출하려고 시도했습니다. 컴파일러가 finde를 작동하지만 연결이 작동하지 않습니다. 링커가 C++ 파일에서 호출 된 함수를 찾을 수 없습니다. .obj 파일은 gernerated이며 프로젝트 xml 파일의 일부입니다. 아무도 지금 어떻게이 오류를 해결할 수 있습니다. 부작용이 없는지 확인하기 위해 생성자에서 c 함수 호출을 호출하는 새 프로젝트를 시작합니다.볼랜드 C++ 링커 오류 C 파일에 포함

Form1.h 생성자를 정의하고, C 함수가 정의 된 헤더를 포함

Form1.cpp가

test.h가 무효 기능을 정의하는 C 함수 생성자를 구현 호출 프로젝트 구조는 다음 보이는 "void abc();"

TEST.C는 test.h을 포함하고 사람이 있습니까

해결되지 않은 외부 "ABC()"

unit1.obj에서 ... 참조 대상의 무효 기능 "{} 무효 ABC()"를 구현 아이디어?? 여기에 몇 가지 코드

#include <vcl.h> 
#pragma hdrstop 
#include "Multicopter_Model.h" 
#include "Unit1.h" 

#pragma package(smart_init) 
#pragma resource "*.dfm" 
TForm1 *Form1; 
__fastcall TForm1::TForm1(TComponent* Owner) 
     : TForm(Owner) 
{ 
abcdefg(); 
return; 
} 

_

#ifndef RTW_HEADER_Multicopter_Model_h_ 
#define RTW_HEADER_Multicopter_Model_h_ 

void abcdefg(); 

#endif */ 

_

#include "Multicopter_Model.h" 
/* Model initialize function */ 
void abcdefg() 
{ 

} 

답변

3

나는 ++ 특히 볼랜드 C에 대해 아무것도 몰라,하지만 당신은 C로 만들어진 C++ 코드에서 뭔가를 선언하는 경우는 일반적으로 선언 주위에 extern "C" { ... }을 넣어해야합니다. 그래서,이 경우에, 당신의 Multicopter_Model.h 파일이 말하고 싶은 것 같은 것을 :

#ifndef RTW_HEADER_Multicopter_Model_h_ 
#define RTW_HEADER_Multicopter_Model_h_ 

#ifdef __cplusplus 
extern "C" { 
#endif 

void abcdefg(); 

#ifdef __cplusplus 
} 
#endif 

#endif 

그 이유는, C에서 구축 된 오브젝트 파일을 과부하 등의 기능을 지원하기 위해 ++ 코드가 뭔가 라는 점이다을 적용하면 이 int이고 int을 반환하는 함수는 해당 정보를 인코딩하기 위해 실제로는 foo__Rint_Aint과 같은 이름이 될 수 있습니다. (참고 1 : 실명 맹 글링 규칙은보다 간결하고 비밀 스럽다.) 주 2 : 이론적으로 이름 맹 글링 이외의 방법으로도 같은 결과를 얻을 수 있지만, 실제로는 모든 사람이 맹 글링을한다. (주 3) 다른 컴파일러는 다양한 형식의 mangling을한다.) 그래서 C++ 컴파일러가 abcdefg이라는 선언을 보았을 때 "이 코드는 C++가 아니라 C"라는 마법 주석이 없으면 이름이 엉망이되어 컴파일 된 코드는 사실상 (필자가 작성한 이름 - mangling 대회) abcdefg_Rvoid_Anone 또는 뭔가. 이 함수는 존재하지 않습니다. 왜냐하면 Form1.obj을 만든 C 컴파일러는 C++ 이름 - mangling을하지 않기 때문에 링커는 찾고자하는 것을 찾을 수 없기 때문입니다.

링커의 오류 메시지에 숨겨진 단서가 있습니다. abcdefg이 아니라 abcdefg()을 찾을 수 없다는 것을 알 수 있습니다. 인수 목록은 찾고자하는 이름으로 인코딩되기 때문입니다.링커는 실제로 그것이 찾고 있던 엉뚱한 괴물이 아닌 인간이 읽을 수있는 이름의 버전을 친절하게보고하고 있습니다.

0

C++에서 작동하도록 함수 오버로드 및 재정의를 수행하면 모든 C++ 컴파일러가 함수 이름에 정보를 추가합니다 (http://en.wikipedia.org/wiki/Name_mangling#Name_mangling_in_C.2B.2B 참조). C가 없으므로 C++에서 프로토 타입을 만들 때 생성 된 심볼 이름은 C 컴파일러에서 생성 된 것과 동일하지 않습니다.

해결 방법에 대한 다른 답변을 참조하십시오.