【问题标题】:Linker not able to find functions in other static libraries链接器无法在其他静态库中找到函数
【发布时间】:2017-10-17 21:58:01
【问题描述】:

我正在尝试静态编译fbi(Linux framebuffer imageviewer),所以我在GNUMakefile 中将-static 添加到LDFLAGS。没有-static 链接工作完美。启用后,我收到各种链接错误,告诉我:

/usr/lib/gcc/arm-linux-gnueabihf/4.9/../../../arm-linux-gnueabihf/libfontconfig.a(fcxml.o): In function 'FcConfigMessage': (.text+0x192): undefined reference to 'XML_GetCurrentLineNumber'

现在我确实有静态库libfontconfig.a 和它显然找不到的函数XML_GetCurrentLineNumber/usr/lib/gcc/arm-linux-gnueabihf/4.9/../../../arm-linux-gnueabihf/libxml2.a 中,根据here 找到的源代码,我用nm libxml2.a 进行了校对。

我想我必须告诉GNUMakefile 中的链接器到底要做什么,但是怎么做呢? ar 库中的目标代码都是 ARM 32 位的,我正在 ARM 32 位上编译和链接。

GNUMakefile 可以找到here,我加了LDFLAGS += -static --verbose -lfontconfig -lfreetype -lpng12 -ltiff

【问题讨论】:

  • 请注意您的图书馆 order 可能很重要。如果没有完整的链接行,我们将无法为您提供帮助。
  • @tofro 你说得对,我添加了信息。
  • 当您执行nm libxml2.a 时,它是否将XML_GetCurrentLineNumber 显示为在那里定义的函数?
  • @MaximEgorushkin 不,但是xmlSAX2GetLineNumberXML_GetCurrentLineNumber 定义为here
  • @JohnnyFromBF 哦,链接器错过了XML_GetCurrentLineNumber。而libxml2.a 提供xmlSAX2GetLineNumber。除非两个函数具有相同的名称,否则这不会链接。 libfontconfig.a 应使用 xmlSAX2GetLineNumberlibxml2.a 必须定义 XML_GetCurrentLineNumber

标签: c gcc linker gnu-make ld


【解决方案1】:

当构建一个共享库时,它通常会链接它需要的其他共享库。

而静态库不能链接其他库,因此在链接到该静态库时,它的依赖项也必须显式链接。

换句话说,您不能只是添加-static 并期望它仍然链接。

尝试在 libxml2.a 和其他缺少的库中链接,直到它链接:

LDFLAGS += -static --verbose -lfontconfig -lfreetype -lpng12 -ltiff -lxml2

【讨论】:

  • 我尝试按照您的建议添加-lxml2,但不幸的是它仍然告诉我libfontconfig.a 找不到libxml2.a 中的功能。将尝试LDFLAGS 的不同顺序。
猜你喜欢
  • 2011-01-10
  • 1970-01-01
  • 2013-08-05
  • 1970-01-01
  • 2014-01-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-25
相关资源
最近更新 更多