我意识到已经以多种方式提出了这个问题,包括 这个非常全面的答案,但我查看了很多并尝试修复我的错误无济于事。
我正在使用 .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 许可协议
这很可能与 C-vs-C++ 链接有关。在您的
main.cpp
中,您可能有这样的内容:其中
header.h
是指您的 c 库。替换它如下:这告诉您的 c++ 编译器在从头文件中定义所需符号时不要使用 c++ 样式的名称修饰,从而允许链接器在 c 编译的
.o
文件中成功找到它们。