extern “C”
//~ add.h
int add(int, int);
//~ add.c
int add(int a, int b)
{
return a + b;
}
gcc 를 사용 하여 add.c 를 컴 파일 합 니 다.그리고 C++코드 에서 add 함 수 를 직접 호출 합 니 다.
//~ main.cpp
#include <add.h>
int main()
{
int a = add(0, 1);
return 0;
}
이렇게 main.cpp 를 컴 파일 합 니 다.
$ gcc -c add.c
$ g++ -c main.cpp
$ g++ main.o add.o -o main
main.o: In function `main':
main.cpp:(.text+0x13): undefined reference to `add(int, int)'
collect2: ld returned 1 exit status
오류 알림 add(int,int)를 찾 을 수 있 습 니 다.main.cpp 를 어 셈 블 리 로 컴 파일 한 후,add 를 호출 하 는 코드 를 보십시오.
movl $1, %esi #
movl $0, %edi #
call _Z3addii # add,
movl %eax, -4(%rbp) # int a
이러한 상황 을 해결 하 는 방법 은 extern"C"를 사용 하 는 것 입 니 다.add.h 에서 add 의 성명 을 extern"C"{}에 넣 는 것 입 니 다.이렇게 하면 g++는 add 에 대해 mangling 을 하지 않 고 링크 기 는 add.o 에서 add 를 찾 아 main.o 로 연 결 됩 니 다.보통 C 코드 의 헤더 파일(libc 의 헤더 파일,예 를 들 어 string.h 포함)에서 함수 의 성명 은 보통 이 렇 습 니 다.
//~ add.h
#ifdef __cplusplus
extern "C" {
#endif
int add(int, int);
#ifdef __cplusplus
}
#endif
이렇게 되면 C 코드 에 add.h 가 포함 되 어 있다 면 add 함 수 를 직접 포함 하 는 성명 입 니 다.C++코드 가 add.h 를 포함 하면 extern"C"가 도 입 됩 니 다.name mangling 에 대해 서 는 여기,그리고 여기 참고 하 세 요.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Docker를 사용한 React 및 .NET Core 6.0 샘플 프로젝트 - 1부이 기사에서는 Entity Framework Core Code First 접근 방식을 사용하는 ASP.NET Core 6.0 WEP API의 CRUD(만들기, 읽기, 업데이트 및 삭제) 작업에 대해 설명합니다. 웹 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.