`“未定义引用”

`undefined reference` when trying to interface C to call C++

本文关键字:未定义引用 引用 未定义      更新时间:2023-10-16

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

有人能提出建议吗?

main.c:

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

示例.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";
 }

有两种方法可以做到这一点。虽然两者都起作用,但其中一个比另一个"干净"旁注:正如特洛伊木马所指出的,您可能在compile/link命令上遗漏了.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.cexample.cpp 时没有魔术一样

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