为什么我运行 ./configure 时有些符号在库中找不到?
Why some symbols are not found in the library when I run ./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!
什么原因导致的?这是否意味着我的库版本错误?或者库应该用其他配置重新编译?遇到这种问题怎么办?
更新:
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
情况变得更加混乱。
What can cause it?
项目开发人员提供的实际警告消息比 "checking ..." 消息更清晰,后者是标准的 Autoconf 消息,解释了它正在做什么,而不是这样做的目的。
这些检查的重点实际上并不是定位特定符号。这只是检查链接器是否可以找到特定库的一种方法。 Autoconf 尝试让链接器解析的符号是由项目开发人员选择的,它应该是所需库的特征。
检查失败意味着链接器未找到有问题的库,或者它们不包含指定的符号。前者更为常见。后者可能是由一个简单的错误引起的,或者是因为链接器选择了错误的库或错误的版本。也有可能发现了一个无法使用的库版本(错误的架构,无法访问,......),两者都是。
项目开发人员似乎选择在这些检查失败时发出额外的消息,这显然是因为仍然可以构建软件,但您将获得功能降低的版本。
Does it mean that I have the wrong version of library? Or maybe the library should be recompiled with other configuration?
正如我已经描述的那样,有多种可能性。 configure
脚本将在构建目录中写入一个日志文件,其中提供有关它究竟尝试了什么以及它如何失败的更多详细信息,以及错误消息。您应该查阅该日志以获取详细信息。
What should I do if I face that kind of problem?
首先调用并阅读配置帮助:
./configure --help
其中大部分是样板文件,但它可能描述了您可以传递给 configure
以解决问题的相关选项。
您还可以在项目文档中找到有用的信息。覆盖范围和质量差异很大,但通常文档会告诉您需要哪些第三方库的版本。
您还可以查阅配置日志以了解失败检查的详细信息。
您通过这些方式收集的信息必须指导您如何从那里开始。解决方案可能是安装额外的库或将适当的参数传递给 configure
,但在某些情况下,您需要更新和重建项目的构建系统,可能还需要它的源来处理您的环境。
简单案例的一些小技巧:
- 构建 库与安装 库不同。链接器一般不会找到卸载的库。
- 在有区别的系统上,您需要相关库的开发包。在此类系统上,运行时包通常不够用。
- 确保你有正确的库风格。我偶尔会用头撞墙,试图发现为什么
configure
似乎没有看到我可以证明已安装的库,最终发现我的库架构错误(32 位与 64 位).
一些包有悖常理地将它们的库安装在链接器的标准搜索路径之外。此类软件包的有用客户通常会提供一种通过命令行参数将路径传递给 configure
的方法,但如果没有,您可以使用 LDFLAGS
环境变量,例如
LDFLAGS="-L/path/to/libfoo.d" ./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!
什么原因导致的?这是否意味着我的库版本错误?或者库应该用其他配置重新编译?遇到这种问题怎么办?
更新:
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
情况变得更加混乱。
What can cause it?
项目开发人员提供的实际警告消息比 "checking ..." 消息更清晰,后者是标准的 Autoconf 消息,解释了它正在做什么,而不是这样做的目的。
这些检查的重点实际上并不是定位特定符号。这只是检查链接器是否可以找到特定库的一种方法。 Autoconf 尝试让链接器解析的符号是由项目开发人员选择的,它应该是所需库的特征。
检查失败意味着链接器未找到有问题的库,或者它们不包含指定的符号。前者更为常见。后者可能是由一个简单的错误引起的,或者是因为链接器选择了错误的库或错误的版本。也有可能发现了一个无法使用的库版本(错误的架构,无法访问,......),两者都是。
项目开发人员似乎选择在这些检查失败时发出额外的消息,这显然是因为仍然可以构建软件,但您将获得功能降低的版本。
Does it mean that I have the wrong version of library? Or maybe the library should be recompiled with other configuration?
正如我已经描述的那样,有多种可能性。 configure
脚本将在构建目录中写入一个日志文件,其中提供有关它究竟尝试了什么以及它如何失败的更多详细信息,以及错误消息。您应该查阅该日志以获取详细信息。
What should I do if I face that kind of problem?
首先调用并阅读配置帮助:
./configure --help
其中大部分是样板文件,但它可能描述了您可以传递给 configure
以解决问题的相关选项。
您还可以在项目文档中找到有用的信息。覆盖范围和质量差异很大,但通常文档会告诉您需要哪些第三方库的版本。
您还可以查阅配置日志以了解失败检查的详细信息。
您通过这些方式收集的信息必须指导您如何从那里开始。解决方案可能是安装额外的库或将适当的参数传递给 configure
,但在某些情况下,您需要更新和重建项目的构建系统,可能还需要它的源来处理您的环境。
简单案例的一些小技巧:
- 构建 库与安装 库不同。链接器一般不会找到卸载的库。
- 在有区别的系统上,您需要相关库的开发包。在此类系统上,运行时包通常不够用。
- 确保你有正确的库风格。我偶尔会用头撞墙,试图发现为什么
configure
似乎没有看到我可以证明已安装的库,最终发现我的库架构错误(32 位与 64 位). 一些包有悖常理地将它们的库安装在链接器的标准搜索路径之外。此类软件包的有用客户通常会提供一种通过命令行参数将路径传递给
configure
的方法,但如果没有,您可以使用LDFLAGS
环境变量,例如LDFLAGS="-L/path/to/libfoo.d" ./configure