찾다

 >  Q&A  >  본문

c++ - extern "C"按着别人博客写的测试程序总是报错?

三个文件:

/* c语言头文件:cExample.h */
#ifndef C_EXAMPLE_H
#define C_EXAMPLE_H
extern int add(int x,int y);     //注:写成extern "C" int add(int , int ); 也可以
#endif
/* c语言实现文件:cExample.c */
#include "cExample.h"
int add( int x, int y )
{
 return x + y;
}
// c++实现文件cppFile.cpp,调用add
extern "C"
{
#include "cExample.h"
}
//注:此处不妥,如果这样编译通不过,换成 extern "C" int add(int , int ); 可以通过
extern "C" int add(int, int);
int main(int argc, char* argv[])
{
    add(2, 3);
    return 0;
}

这都是别人博客的代码,他说不会错,然后我在VS2015运行了,报错,错误 LNK2019 无法解析的外部符号 _add,该符号在函数 _main 中被引用。我换了好几个人博客把代码复制进去都是报同样的错误,我不知道是什么问题,上面注释里的我也试了还是报错。

大家讲道理大家讲道理2806일 전653

모든 응답(2)나는 대답할 것이다

  • 天蓬老师

    天蓬老师2017-04-17 15:05:40

    오류가 발견되었습니다.

    .c와 .h를 프로젝트에 끌어다 놓지 않고 그냥 이 디렉토리에 넣었습니다. 해결되었습니다.

    회신하다
    0
  • PHP中文网

    PHP中文网2017-04-17 15:05:40

    원본 포스터가 스스로 문제를 해결한 것을 방금 봤습니다. 그러나 이 예는 gcc에서 여전히 잘못되었습니다.

    으아악

    이것은 C 컴파일러가 cExample.c를 컴파일할 때 add 함수의 코드를 컴파일하기 위해 C 컴파일러를 호출하는 것이지만 C 컴파일러는 이를 add이 알지 못한다고 생각하기 때문입니다. function C 함수이므로 컴파일 후에는 add 함수 이름이 _Z3addii으로 변경됩니다. 이렇게 cppFile.cpp 파일에서 add 함수의 C 버전을 사용하도록 지정하더라도 이 함수는 실제로 존재하지 않으므로 확인되지 않은 외부 기호가 나타납니다.

    이 문제를 해결하려면 cExample.h 파일에 다음을 작성하세요.

    으아악

    cExample.h에 선언된 함수가 다른 C 모듈에서 호출되는 경우 엄격한 작성 방법은 다음과 같습니다.

    으아악

    cExample.{h,c}를 VS의 프로젝트에 드래그하면 문제가 해결되는 이유는 알 수 없습니다. 내 생각엔 VS가 파일 확장자가 .c인 파일을 발견하면 자동으로 C 컴파일러를 사용하여 컴파일하는 것입니다.

    회신하다
    0
  • 취소회신하다