Redian新闻
>
如何在C里面call C++的routine呢
avatar
如何在C里面call C++的routine呢# Programming - 葵花宝典
l*i
1
看了那个 C++ lite FAQ,还是没有搞定:
//cppfile.cpp
#include
void foo1(){
std::cout<}
//cppfile.h
extern "C" {
void foo1();
};
//cfile.c
#include "cppfile.h"
main()
{
foo1();
}
编译:
g++ -c cfile.c
g++ -c cppfile.cpp
g++ -o out.bin cfile.o cppfile.o
最后link的时候总是出错"cfile.o: In function `main':
cfile.c:(.text+0x5): undefined reference to `foo1'
collect2: ld returned 1 exit status
"
哪位给指点一下?多谢多谢。
avatar
k*f
2
add
#include "cppfile.h"
in cppfile.cpp.
avatar
r*r
3

ditto.
the "extern" tells g++ not to mangle the function name, so that main can
find it.
this has to be done when you compile the cppfile.cpp.

【在 k**f 的大作中提到】
: add
: #include "cppfile.h"
: in cppfile.cpp.

avatar
r*r
4
gnu has some programs in the "binutils" package. they are very useful.
like nm, c++filt, objdump, ldd etc.
in this example, you can type: "nm cppfile.o", and it tells you that the
function name has be mangled to __Z4foo1v, hence the error message that foo1
cann't be found.
use c++filt to de-mangle the name: "c++filt __Z4foo1v", and it tells you the
original function name is foo1.
avatar
c*n
5
对, randomtiger说得对,你用nm看看object file里头的函数或者变量输出名,然后再
在c里头按照这个名字掉就好了。
其实原因就是c++支持重载,所以输出函数名字的时候在前面加了"_";
avatar
l*i
6
多谢楼上几位的回复,涨知识了。
avatar
t*t
7
你说的不对

【在 c*******n 的大作中提到】
: 对, randomtiger说得对,你用nm看看object file里头的函数或者变量输出名,然后再
: 在c里头按照这个名字掉就好了。
: 其实原因就是c++支持重载,所以输出函数名字的时候在前面加了"_";

avatar
j*i
8
C不认识头文件中的extern "C"
google "C++中extern “C”含义深层探索",解释的很清楚。

【在 l*********i 的大作中提到】
: 看了那个 C++ lite FAQ,还是没有搞定:
: //cppfile.cpp
: #include
: void foo1(){
: std::cout<: }
: //cppfile.h
: extern "C" {
: void foo1();
: };

相关阅读
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。