链接目标文件时出现“未定义的引用”错误

新手上路,请多包涵

我意识到已经以多种方式提出了这个问题,包括 这个非常全面的答案,但我查看了很多并尝试修复我的错误无济于事。

我正在使用 .cpp 和 .c 文件来创建程序。我用 g++ 编译了所有文件,它似乎没有更多的链接错误,尽管它给了我一堆与 C 语法相关的 C++ 错误。这是我使用的命令:

 g++ -o program main.cpp /data/*.c -l[...libs]

main.cpp 调用 .c 文件中的函数。然后我明白,不应尝试使用一种编译器同时编译 .c 和 .cpp 文件,而应将 gcc 用于一个编译器,将 g++ 用于另一个编译器,然后简单地链接目标文件。

所以我这样做了(.c 文件是库的一部分,并且已经有 .o 文件)

 g++ -c main.cpp
g++ -o program main.o /data/*.o -l[..libs]

但是在这里我会得到从 main.cpp 调用到预编译的 .c 文件的函数的“未定义引用”错误,这是我以前没有得到的错误。

有人可以帮忙吗?还是我可能需要提供更多信息?

编辑(更深入的代码摘录,我试图简化,否则将无法阅读,但如果我仍然需要添加内容,请告诉我,我会尝试删除不必要的代码):

主.cpp:

 #include "header.h"

int main(int argc, char** argv) {
    string s1 = argv[2];
    fn1(s1)
}

头文件.h

 void fn1(string s1)

我的文件.c

 #include "header.h"

void fn1(string s1){
    fprintf(stdout, " you entered %s", s1);
    fflush(stdout);
}

回答:

@Smeehey 帮助我找出解决方案,实际上我仍在使用的 .hpp 文件中包含旧标题。但核心解决方案确实是使用外部 C{}。

原文由 Victor.dMdB 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.5k
1 个回答

这很可能与 C-vs-C++ 链接有关。在您的 main.cpp 中,您可能有这样的内容:

 #include <data/header.h>

其中 header.h 是指您的 c 库。替换它如下:

 extern "C" {
#include <data/header.h>
}

这告诉您的 c++ 编译器在从头文件中定义所需符号时不要使用 c++ 样式的名称修饰,从而允许链接器在 c 编译的 .o 文件中成功找到它们。

原文由 Smeeheey 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题