我在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
可是我用了,怎么不管用呢,还是出现了好多错误,迷惑中....