C 未定义对 `some_foo' 的引用。

3

I have 3 files in my gtk+ app:

main.c:

#include <gtk/gtk.h>
#include <glib/gi18n.h>

#include "mainwindow.h"

int main(int argc, char** argv)
{
    MainWin*      win;
    GError* err = NULL;
    int a = 0;
    a = some_foo();
    gtk_main();
    return 0;
}

mainwindo.h

#include <gtk/gtk.h>


typedef struct _MainWin
{
    GtkWindow parent;

} MainWin;

GtkWidget* main_win_new();

int some_foo();

MainWindow.c

#include "mainwindow.h"


int some_foo()
{
  return 1;
}

当我在主函数中尝试调用some_foo并编译时,出现错误:undefined reference to `some_foo'。这是什么问题?

谢谢。


你使用了哪个编译器/命令? - tristan
3
我猜你的构建过程中没有包括 MainWindow.c 文件。你是如何构建你的项目的? - avakar
你有没有考虑使用Makefile呢?很可能你的项目会超过一个或两个文件。如果需要帮助编写Makefile,请更新你的问题。另外,无法抗拒...再见了,感谢所有的foo。 - Tim Post
我怀疑你的程序中混合了C++/C符号。尝试在你的C代码中使用extern "C" { #include "mainwindow.h" }。如果这不起作用,请给我们提供make输出以及nm MainWindow.onm main.o的转储。 - dma_k
1个回答

3

您可能没有将MainWindow.c包含在构建中。例如,在shell中,它可能看起来像这样:

gcc $ALL_THE_FLAGS main.c MainWindow.c

我使用makefile进行编译,这个makefile是由autoconf生成的,而且非常庞大。我该如何将mainwindow.c文件包含进去? - 0xAX
1
在这种情况下,您必须查看您的Makefile.in并在其中添加源文件和目标文件。如果该文件较短,可以将其复制到问题中吗?或者,您也可以使用像pastebin这样的服务。@sterh - Georg Fritzsche
1
@sterh:你能添加你的Makefile.am文件吗?这样它会更易读。 - Hasturkun
2
@sterh:在你的 Makefile.am 中,MainWindow.c 使用了小写(mainwindow.c),但是在你的问题中它被大写 - 你确定你没有另一个名为 mainwindow.c 的文件正在被构建吗?(我假设你正在使用 Linux 或类似区分大小写的系统)。 - Mike Dinsdale
2
@sterh Makefile不是由autoconf生成的。Makefile是由configure脚本从Makefile.in生成的,而Makefile.in是由automake生成的。 - William Pursell

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接