包装C++代码的问题

Problems with wrapping a C++ code

本文关键字:问题 代码 C++ 包装      更新时间:2023-10-16

为了尝试在C中包装C++代码,我使用了以下内容:header.h

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

来源.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_stream>::operator<lt;(std::basic_stream>&(*((std:;basic_stream>>('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退出状态

如何编译并运行这个简单的代码?它应该成为我未来的基础发展

也与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},因为它会引起混淆。

您仍然需要使用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链接器指定库。(

你不能这样做,你可以用gcc编译C代码,然后用g++将它与C++对象链接,通过extern关键字引用C对象中定义的符号,但你不能做相反的