【问题标题】:C undefined reference to `some_foo'C 未定义对“some_foo”的引用
【发布时间】:2010-05-23 13:35:37
【问题描述】:

我的 gtk+ 应用中有 3 个文件:

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 并尝试编译时,我看到错误:未定义的对 `some_foo' 的引用。怎么了?

谢谢。

【问题讨论】:

  • 您使用了哪些编译器/命令?
  • 我猜你的构建中没有包含 MainWindow.c。你如何构建你的项目?
  • 你考虑过只使用 Makefile 吗?您的项目很可能会超过一两个文件。如果您需要帮助编写一个,请更新您的问题。此外,无法抗拒......这么久,感谢所有的富翁。
  • 我怀疑,您的程序中混合了 C++/C 符号。尝试在 C 代码中使用 extern "C" { #include "mainwindow.h" }。如果没有帮助,请给我们转储make 输出加上nm MainWindow.o 加上nm main.o

标签: c makefile autoconf


【解决方案1】:

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

gcc $ALL_THE_FLAGS main.c MainWindow.c

【讨论】:

  • 我用makefile编译。这个 makefile 由 autoconf 生成。而且很大。如何包含 mainwindow.c 文件?
  • 在这种情况下,您必须查看您的Makefile.in 并在那里添加源文件和目标文件。如果该文件较短,也许将其复制到问题中?或者,也有像 pastebin 这样的服务。 @sterh
  • @sterh:你能添加你的 Makefile.am 文件吗?它应该更具可读性
  • @sterh:在你的Makefile.am 中,MainWindow.c 是小写的 (mainwindow.c),但在你的问题中,你已经把它大写了 - 你确定你没有有另一个正在构建的名为mainwindow.c 的文件吗? (我假设您使用的是 linux 或文件名区分大小写的类似系统)。
  • @sterh Makefile 不是由 autoconf 生成的。 makefile由Makefile.in中的configure脚本生成,Makefile.in由automake生成。
猜你喜欢
  • 1970-01-01
  • 2016-05-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-10
  • 2011-05-07
相关资源
最近更新 更多