2011-10-31 60 views
3

要尝试C++中的C代码缠绕问题,我使用了以下内容: header.h与包裹一个C++代码

#ifdef __cplusplus 
extern "C" 
#endif 
void func(); 

source.cpp

#include "header.h" 
#include <iostream> 
extern "C" void func() 
{ 
std::cout << "This is C++ code!" << std::endl; 
} 

和由source.c

#include "header.h" 
int main() 
{ 
func(); 
} 

为了编译和链接,我用了下面的顺序:

g++ -c source.cpp 
gcc source.c source.o -o myprog 

我得到的错误是: ENCE到std::basic_ostream<char, std::char_traits<char> >& std::endl<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&)' source.cpp:(.text+0x1c): undefined reference to的std :: basic_ostream> ::操作< <(STD :: basic_ostream> &(*)(STD :: basic_ostream> &))” source.o :在功能__static_initialization_and_destruction_0(int, int)': source.cpp:(.text+0x45): undefined reference to的std ::的ios_base :: ::初始化的init()” source.cpp :(文字+ 0x4a):未定义的引用std::ios_base::Init::~Init()' source.o:(.eh_frame+0x12): undefined reference to __gxx_personality_v0' collect2:LD返回1退出状态

我怎么能让这个简单的代码编译并运行?它应该作为我未来 开发的基础。

回答

4

链路与克++,以及:

g++ -c source.cpp 
g++ source.c source.o -o myprog 

或者更好:

g++ -c source.cpp -o source_cpp.o 
gcc -c source.c -o source_c.o 
g++ -o myprog source_cpp.o source_c.o 

最好避免公共前缀源{CPP,C},因为它会导致混乱。

+0

谢谢,第一个选项工作:)。如何在一行中执行上述选项1? – user506901

+0

'g ++ -o myprog source.cpp source.c' – trojanfoe

+0

这不会将c源代码编译为C++吗? – Will03uk

3

你仍然必须用C++链接器链接:

gcc -o source-c.o source.c 
g++ -o source-p.o source.cpp 
g++ -o myprog source-c.o source-p.o 

你的C++对象文件将需要解决从C++库,其中仅C++链接器会自动拉符号。 (或者,您可以手动为C链接器指定库。)

0

您不能这样做,您可以使用gcc编译C代码,然后使用g ++将它与C++对象链接起来,引用在通过extern关键字的C对象,但你不能做相反的

+0

它不仅可能,而且经常使用。这就是为什么头文件系统头文件中的函数被声明为'extern“C”'。唯一不能以这种方式导出的东西是类和对象。 –

+0

@JoachimPileborg:那么为什么你会倒下?你觉得他说什么? – Hossein