일반적인 방법은 어셈블러와 C/C++ 컴파일러가있는 빌드 환경과 도구를 사용하는 것입니다. 컴파일러 (및 어셈블러)는 소스 파일을 가져 와서 중간 개체 파일 형식을 생성합니다. Microsoft Windows에서 Microsoft 도구를 사용하면 .obj 파일이됩니다.
링커는 fortran, cobol, C++, c, objective-c, assembly 등 다양한 언어로 생성 된 .obj 파일을 단일 응용 프로그램 이진 파일로 연결하는 데 사용됩니다.
오브젝트 파일은 기본적으로 작은 바이트의 레이블 및 미해결 된 심볼의 콜렉션으로, 다른 오브젝트 파일의 내용을 가리 키기 위해 링크 중에 패치해야하는 바이트의 청크를 레이블링합니다.
이제는 거의 익숙하지 않은 경험이있는 플랫폼에서 C++ 컴파일러는 어떤 종류의 크로스 언어 바이너리 호환성도 염두에 두지 않았습니다. 반면에 C 컴파일러는 있습니다. 따라서 C++ 컴파일러는 매개 변수 및 반환 유형에 대한 모든 종류의 정보를 심볼 이름에 통합하는 고도로 변형 된 심볼을 만듭니다. 이 메커니즘은 운영자 과부하를 가능하게합니다.
어쨌든, 요점은,
- 당신은 ASM 파일을 구축 할 필요가있다. 어셈블러가 없다면, 당신은 운이 좋을 것입니다. 그리고 아마도 당신의 c/C++ 툴셋과 같은 벤더가 필요합니다.
- 외부 기호의 이름을 C++ 프로그램에 알려줘야합니다. 호환되는 방식으로. 이것은 헤더 파일이 일반적으로 사용되는 것입니다.
는 그래서 PID 코드에 대한 함수 선언을 개최하고이 같은 뭔가 배치 할 헤더 파일을 만듭니다
통근자 "C"무효 PidMain (무효);
이제 C++ 프로그램에서 헤더 파일을 # 포함하고 어셈블러에서 생성 된 오브젝트 파일이 환경 링크 단계에 포함되어 있는지 확인하십시오.
어떤 종류의 호출 규칙이 관련되어있을 수 있습니다. 일부 환경은 스택에 푸시 된 명령 및 스택 정리를 담당하는 명령과 다른 표준을가집니다. 대부분의 ms windows 도구 모음은 적어도 __pascal 및 __cdecl 호출 규칙을 지원하므로 선언은 다음과 같습니다.
extern "C"void __pascal PidMain (void);
특정 환경에서 여러 호출 규칙이있는 경우 구체적인 지식이 없습니다. 그래서 나는 이것이 얼마나 도움이되었는지 모른다. 나는 행운을 비네.
C++의 경우 함수 선언에 'extern "C"'가 필요하다. –
@Pavel : 감사합니다. –
그리고 다른 대답 링크에 obj 파일을 함께 언급했다. – simon