要在C中尝试C ++代码包装,我使用了以下内容: header.h
#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
我得到的错误是:
到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&gt; :: operator&lt;&lt;(std :: basic_ostream&gt;&amp;(*)(std :: basic_ostream&gt;&amp;))'
source.o:在函数__static_initialization_and_destruction_0(int, int)':
source.cpp:(.text+0x45): undefined reference to
std :: ios_base :: Init :: Init()'
source.cpp :(。text + 0x4a):对std::ios_base::Init::~Init()'
source.o:(.eh_frame+0x12): undefined reference to
__ gxx_personality_v0'的未定义引用
collect2:ld返回1退出状态
如何编译和运行这个简单的代码?它应该成为我未来的基础 发展。
答案 0 :(得分:5)
与g ++链接:
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},因为它会引起混淆。
答案 1 :(得分: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链接器指定库。)
答案 2 :(得分:0)
你不能这样做,你可以用gcc编译C代码,然后用g ++将它与c ++对象链接,通过extern关键字引用C对象中定义的符号,但你不能做相反的事情