为什么运行./configure时在库中找不到某些符号?

时间:2018-10-30 17:55:47

标签: compilation linker autotools configure

我正在尝试从源代码安装8086 emulator。 我运行./configure,并在输出中看到以下警告:

checking for g_signal_emit in -lgtk-x11-2.0... no
configure: WARNING: Without GTK there will be no GTK-GUI of i8086emu!
checking for XkbGetMap in -lgdk-x11-2.0... no
configure: WARNING: Without GTK there will be no GTK-GUI of i8086emu!
checking for g_malloc in -latk-1.0... no
configure: WARNING: Without ATK there will be no GTK-GUI of i8086emu!
checking for g_log in -lgdk_pixbuf-2.0... no
configure: WARNING: Without GTK there will be no GTK-GUI of i8086emu!

是什么原因引起的?这是否意味着我的库版本错误?还是应该使用其他配置重新编译该库?遇到此类问题该怎么办?

UPD: g_signal_emit符号不属于-lgtk-x11-2.0,而是属于-lgobject-2.0。如果我运行:

env LIBS='-lgobject-2.0' ./configure

那我有

checking for g_signal_emit in -lgtk-x11-2.0... yes

情况变得更加令人困惑。

1 个答案:

答案 0 :(得分:2)

  

什么原因引起的?

由项目开发人员提供的实际警告消息比“检查...”消息更清晰,“检查...”消息是标准的Autoconf消息,说明了它在做什么,而不是在做什么。

这些检查的重点实际上并不是要找到特定的符号。这只是检查链接器是否可以定位特定库的一种方法。 Autoconf试图使链接器解析的符号是由项目开发人员选择的,并且应该是所需库的特征。

检查失败表示链接器未找到有问题的库,或者它们不包含指定的符号。前者更为普遍。后者可能是由一个简单的错误引起的,或者是因为链接器选择了错误的库或错误的版本。还可能会发现该库的不可用版本(错误的体系结构,无法访问等),两者兼而有之。

当这些检查失败时,项目开发人员似乎选择发出其他消息,这显然是因为仍可以构建软件,但您将获得功能降低的版本。

  

这是否意味着我的库版本错误?还是应该使用其他配置重新编译该库?

正如我已经描述的那样,有多种可能性。 configure脚本将在构建目录中写入一个日志文件,该日志文件提供了有关其确切尝试内容和失败方式的详细信息,并带有错误消息。您应该查阅该日志以获取详细信息。

  

如果遇到此类问题该怎么办?

首先调用并阅读配置帮助:

./configure --help

其中大部分是样板,但可能描述了相关选项,您可以将其传递给configure来解决这种情况。

您还可以在项目文档中找到有用的信息。覆盖范围和质量差异很大,但是通常文档会告诉您您需要哪个版本的第三方库。

您还可以查阅配置日志以获取失败检查的详细信息。

您以这些方式收集的信息必须指导您如何从那里进行。解决方案可能是安装其他库或将适当的参数传递给configure,但是在某些情况下,您需要更新和重建项目的构建系统,也许还需要其源代码来处理您的环境。

一些简单案例的提示:

  • 构建库与安装库不同。链接程序通常将找不到卸载的库。
  • 在有区别的系统上,您需要相关库的开发包。在这些系统上,运行时软件包通常是不够的。
  • 确保您具有正确的库风格。我偶尔会碰壁,试图发现为什么configure似乎看不到我可以证明的库已安装,最终发现我的库体系结构错误(32位与64位) )。
  • 某些软件包错误地将其库安装在链接器的标准搜索路径之外。这类软件包的聪明客户通常提供了一种通过命令行参数将路径传递到configure的方法,但是如果没有,您也许可以使用LDFLAGS环境变量 eg

    LDFLAGS="-L/path/to/libfoo.d" ./configure