【问题标题】:Problems with wrapping a C++ code包装 C++ 代码的问题
【发布时间】:2011-12-18 20:56:23
【问题描述】:

为了尝试在 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 tostd::basic_ostream >::operator& (*)(std::basic_ostream >&))' source.o: 在函数__static_initialization_and_destruction_0(int, int)': source.cpp:(.text+0x45): undefined reference tostd::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 个退出状态

我怎样才能使这个简单的代码编译和运行?它应该成为我未来的基础 发展。

【问题讨论】:

    标签: c++ c


    【解决方案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
    

    最好避免使用公共前缀 source.{cpp,c},因为它会引起混淆。

    【讨论】:

    • 谢谢,第一个选项有效:)。怎么能在一行中执行上述选项 1?
    • g++ -o myprog source.cpp source.c
    • 这不是把c源编译成c++吗?
    • 我不认为,因为 .c 会告诉编译器做正确的事情。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 这不仅可能,而且使用频率很高。这就是头系统头文件中的函数被声明为extern "C" 的原因。唯一不能以这种方式导出的是类和对象。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-05-24
      • 2012-06-13
      • 2012-06-14
      • 2016-08-25
      • 1970-01-01
      • 2017-10-17
      • 1970-01-01
      相关资源
      最近更新 更多