l*********i 发帖数: 483 | 1 看了那个 C++ lite FAQ,还是没有搞定:
//cppfile.cpp
#include
void foo1(){
std::cout<<"this is foo1()"<
}
//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
"
哪位给指点一下?多谢多谢。 |
k**f 发帖数: 372 | 2 add
#include "cppfile.h"
in cppfile.cpp. |
r*********r 发帖数: 3195 | 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.
|
r*********r 发帖数: 3195 | 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. |
c*******n 发帖数: 72 | 5 对, randomtiger说得对,你用nm看看object file里头的函数或者变量输出名,然后再
在c里头按照这个名字掉就好了。
其实原因就是c++支持重载,所以输出函数名字的时候在前面加了"_"; |
l*********i 发帖数: 483 | |
t****t 发帖数: 6806 | 7 你说的不对
【在 c*******n 的大作中提到】 : 对, randomtiger说得对,你用nm看看object file里头的函数或者变量输出名,然后再 : 在c里头按照这个名字掉就好了。 : 其实原因就是c++支持重载,所以输出函数名字的时候在前面加了"_";
|
j***i 发帖数: 3096 | 8 C不认识头文件中的extern "C"
google "C++中extern “C”含义深层探索",解释的很清楚。
【在 l*********i 的大作中提到】 : 看了那个 C++ lite FAQ,还是没有搞定: : //cppfile.cpp : #include : void foo1(){ : std::cout<<"this is foo1()"<: } : //cppfile.h : extern "C" { : void foo1(); : };
|