尝试连接C以调用C ++时,“undefined reference”

时间:2016-03-27 19:02:27

标签: c++ c interface

我试图从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";
 }

1 个答案:

答案 0 :(得分:1)

有两种方法可以做到这一点。虽然两者都有效,但其中一个更清洁&#34;比另一个。 旁注:正如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

注意:在这两种情况下,&#34;链接器&#34;必须c++才能解析std::*使用

example.cpp

<强>更新

  

什么是mypgm

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

对于在示例指令或代码序列中任意的东西,它是非常标准的命名法[就像这里的SO]。你可以替换&#34; mypgm&#34;用&#34; ursa_majors_test_program&#34;或者&#34;示例&#34;或者您喜欢的任何内容。要运行该程序,请键入./mypgm [或./ursa_majors_test_program./example]

该名称没有 magic ,就像您没有魔法来命名源文件main.cexample.cpp

它应该是功能的描述。如果您曾说过您正在编写文本编辑程序,在我的示例中,我可能已经使用过-o editor