请问:如何在c文件中调用cpp文件里的函数

时间:2022-09-30 16:35:48
我在a.cpp里定义了一个函数f, 是个普通的c函数,没有c++语法.
我在b.c里调用的时候会出问题:
在tonado环境下能通过编译,但是不能加载.加载时会认为没有f函数实体.

我看过很多人答复这类问题时说加
extern "C"
{
#include "a.h"
};

但是这好象是c++调用C的方法.
我在a.cpp里也用了extern "C",仍然不能解决c调用c++函数的问题.

我到编译后的.o里看过,同样的函数,比如f,如果在c文件里被编译成了.o,名字仍然是f,而放到cpp文件编译成.o后名字就变成了f_Fv之类的.这是否就是c文件不能识别c++的原因?但是却通过编译了,因为编译不检查函数是否存在.而加载时会检查.

说的这么详细,不知道哪位高手也能详细解答一下?谢谢.

8 个解决方案

#1



// a.h
#ifndef _A_H_
#define _A_H_

void hello(void);

#endif // _A_H_

// a.cpp
#include <stdio.h>

extern "C" void hello(void)
{
  printf("hello\n");
}

// main.c
#include "a.h"

int main(void)
{
  hello();

  return 0;
}

g++ -c a.cpp ; gcc -c main.c ; gcc -o main *.o

这里要注意一点,如果是有extern这样的语法存在,则必然需要由C++的编译器来编译。

#2


extern "C"
这样导出的函数名字就不包含类前缀了。

#3


正解 

#4


正解 

#5


正解 

#6


谢谢  用了很好

#7


受教了 谢谢前辈了

#8


可是我用了,怎么不管用呢,还是出现了好多错误,迷惑中....

#1



// a.h
#ifndef _A_H_
#define _A_H_

void hello(void);

#endif // _A_H_

// a.cpp
#include <stdio.h>

extern "C" void hello(void)
{
  printf("hello\n");
}

// main.c
#include "a.h"

int main(void)
{
  hello();

  return 0;
}

g++ -c a.cpp ; gcc -c main.c ; gcc -o main *.o

这里要注意一点,如果是有extern这样的语法存在,则必然需要由C++的编译器来编译。

#2


extern "C"
这样导出的函数名字就不包含类前缀了。

#3


正解 

#4


正解 

#5


正解 

#6


谢谢  用了很好

#7


受教了 谢谢前辈了

#8


可是我用了,怎么不管用呢,还是出现了好多错误,迷惑中....