"未定义参考"链接目标文件时出错

时间:2016-08-04 07:57:26

标签: c++ c gcc linker g++

我意识到这个问题已经通过多种方式提出,包括this very comprehensive answer,但我看了很多,并尝试修复我的错误无济于事。

我正在使用.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文件的函数的错误,这是我之前没有得到的错误。

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

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

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 {}。

3 个答案:

答案 0 :(得分:10)

这很可能与C-vs-C ++链接有关。在main.cpp中,您可能会遇到以下情况:

#include <data/header.h>

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

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

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

答案 1 :(得分:2)

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

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

下一步:学会编写合适的makefile。

答案 2 :(得分:0)

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

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

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

请附上您的代码