"Undefined reference to" 链接目标文件时出错



我意识到这个问题已经被问了很多种方式,包括这个非常全面的答案,但我看了很多,并试图纠正我的错误,但都无济于事。

我正在使用.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文件的函数的"未定义引用"错误,这些错误我以前没有得到。

有人能帮忙吗?或者我可能需要提供更多信息?

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

main.cpp:

#include "header.h"
int main(int argc, char** argv) {
    string s1 = argv[2];
    fn1(s1)
}

header.h

void fn1(string s1)

mycfile.c

#include "header.h"
void fn1(string s1){
    fprintf(stdout, " you entered %s", s1);
    fflush(stdout);
}

答案:

@Smeehey帮我找到了解决方案,实际上我还在使用的.hpp文件中包含旧的头。但核心解决方案实际上是使用外部C{}。

这很可能与C-vs-C++链接有关。在你的main.cpp中,你可能有这样的东西:

#include <data/header.h>

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

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

这个命令告诉您的c++编译器在定义头中所需的符号时不要使用c++样式的名称篡改,这样链接器就可以在c编译的.o文件中成功地找到它们。

您必须使用gcc命令编译C文件,使用gccg++编译C++文件,并使用g++命令进行链接。这个序列可能会起作用:

 gcc -c data/*.c main.cpp
 g++ -o program *.o -l <libs...>

下一步:学习编写正确的makefile。

这是一个黑暗中的镜头,但问题可能是C和编译的Cpp文件相似但略有不同。。。。由于名称空间,函数foo将生成符号some_prefix@foo与C不同,goo生成符号goo

尝试在.cpp文件中执行以下操作

extern "C" { #include "yourcfilesheader.h" }

请附上您的代码

最新更新