【问题标题】:Undefined reference to Function defined in same .c file invoked through static library对通过静态库调用的同一 .c 文件中定义的函数的未定义引用
【发布时间】:2017-12-01 11:24:03
【问题描述】:

这个静态 C 库 (libabc.a) 链接到 C++ 程序。

在我的 qmake 专业文件中,我使用了
LIBS += pathToLib/libabc.a 创建静态库时我没有任何问题。 使用 qmake 和 gmake 编译和运行 cpp 应用程序时,会创建其他 cpp 文件的目标文件,但出现以下错误:

../abc/libabc.a(mdl.o): In function 'SetExt': abc/src/mdl.c:2186: undefined reference to 'func1'

在 mdl.c 中,声明和定义都在那里。
静态 void func1(int *, char *, char *);

static void func1(int *m, char *p, char *s)
{
.....
}

这个函数的函数调用在C文件mdl.c中。创建静态库(使用 gcc 和 ar)时我犯了错误吗?或者,我错过了什么?

【问题讨论】:

  • @Incomputable 没有看到 extern 并不能两者兼而有之。这意味着链接器稍后会感到困惑。我不是你应该告诉的那个人
  • @UKMonkey,感谢您提供的信息。有什么资源可以阅读吗?

标签: c++ c linker qmake


【解决方案1】:

您将函数声明为

static void func1(int *, char *, char *);

根据 6.2.2 标识符的链接the C Standard 的第 3 段:

如果声明一个对象的文件范围标识符或 函数包含存储类说明符static,标识符 有内部联系。

因此,func1() 无法从编译单元外部访问 - 它只能在它所在的源文件中使用。

【讨论】:

  • 是的,我知道这一点.. 但我的疑问是,既然这个函数是在定义它的特定 c 文件中调用的,那么为什么会抛出错误呢?在 mdl.c 中,func1() 被声明、定义和调用……这个函数在任何 cpp 文件中都没有被调用……
  • 你的意思是说我什至不能把这个目标文件链接到其他程序,即使那个函数在那个 cpp 程序中没有被调用?
  • @vinu960 你是如何编译你的代码的?您将其标记为 C C++,但仅提及 C 代码。您是否在某处忘记了extern "C" ...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多