【问题标题】:`undefined reference` when trying to interface C to call C++尝试通过接口 C 调用 C++ 时出现“未定义的引用”
【发布时间】:2016-07-15 01:32:39
【问题描述】:

我试图从 C 调用 C++。我不确定链接顺序。这可能是导致错误的原因。由于某些原因,编译器会抱怨undefined reference to helloWorld。

有人可以建议吗?

main.c:

 #include "example.h"
 #include <stdio.h>
 int main(){
     helloWorld();
     return 0;
 }

example.h:

 #ifndef HEADER_FILE
 #define HEADER_FILE
 #ifdef __cplusplus
     extern "C" {
 #endif
         void helloWorld();
 #ifdef __cplusplus
     }
 #endif
 #endif

example.cpp:

 #include "example.h"
 #include <iostream>
 void helloWorld(){
     std::cout << "Hello World from CPP";
 }

【问题讨论】:

标签: c++ c interface


【解决方案1】:

有两种方法可以做到这一点。虽然两者都有效,但其中一个比另一个“更干净”。 旁注: 正如 trojanfoe 所指出的,您可能在编译/链接命令中遗漏了 .o。

这是一个两步过程:

cc -c main.c
c++ -o mypgm example.cpp main.o

这有点难看,因为通常的约定是编译的源是带有main的源

这是更常用的方法:

c++ -c example.cpp
cc -c main.c
c++ -o mypgm main.o example.o

注意:在这两种情况下,“链接器”必须是 c++ 才能解析 example.cpp 使用的 std::*


更新:

mypgm 是什么?

mypgm [只是一个示例名称] 是 [完全链接并准备好运行] 输出 可执行文件或程序的名称。这是-o 选项的参数。链接器获取您的可重定位输入.o 文件,将它们链接在一起以生成输出文件[现在可以作为命令运行]。

对于示例指令或代码序列中的任意事物[就像这里的 SO],这是非常标准的命名法。您可以将“mypgm”替换为“ursa_majors_test_program”或​​“example”,或者任何您想要的。要运行程序,请输入./mypgm [或./ursa_majors_test_program 或./example]

名字没有魔法,就像你给源文件命名main.c和example.cpp没有魔法一样

它应该描述功能。如果你说你正在开发一个文本编辑程序,在我的例子中,我可能会使用-o editor

【讨论】:

  • 知道了。谢谢你。 c++ -c example.cppcc -c main.cc++ -o out example.o main.o./out
猜你喜欢
  • 2017-09-20
  • 1970-01-01
  • 2021-04-25
  • 2011-09-02
  • 1970-01-01
  • 2015-08-21
  • 1970-01-01
  • 2011-04-03
  • 2011-05-03
相关资源
最近更新 更多