如果 ./configure 抱怨缺少 header 文件,你会怎么做

What do you do if ./configure complains about a missing header file

所以我最近 运行 在尝试使用 chromeos (chronos).

构建 a program 时遇到了问题

我克隆了代表os 并按照指示 运行 ./autogen.sh。到目前为止没有问题。

但是,当我 运行 ./configure 我收到以下消息:

checking arpa/inet.h usability... no

这告诉我配置脚本无法找到 arpa/inet.h header 文件,但是它没有告诉我它在寻找什么。

鉴于常规 chrome 安装非常不寻常,我对出现某种错误并不感到惊讶,但该消息对于如何修复它根本没有帮助。

所以我的问题是:

  1. ./configure 正在寻找 header 吗?
  2. 我是不是把它们放在了某个地方却找不到?
  3. 如何让它找到它们?

对于第一个问题,我查看了 configure 文件本身。这是一个 shell 脚本,所以我可以将附加 -x 替换为最顶部的 #! /bin/sh 以使 shell 回显它的每个命令 运行.

事实证明这是无法解决的,因为 configure 很大并且函数之间有很多跳跃。所以我想知道那个神奇的 configure 脚本是什么,我之前 运行 那个 ./autogen.sh 脚本是什么,我怎样才能 运行 更 详细 方式。事实证明,autogen 是 autoconf and the result is written as a configure file. Turn's out there's a documentation page 阅读的描述,解释了如何调试生成的脚本。

按照说明,我已经用 set -xset +x.

configure 脚本中包装了检查 arpa/inet.h 的调用

我在里面找不到任何 find 或类似的东西,但我在这里和那里看到了一些 gcc -E test.c。我猜 autoconf 正在创建一个简单的 C 文件,其中包含一个 #include 指令,然后 autoconf 解析 gcc 的输出以判断 header 根本找不到。

所以我的下一个测试是创建一个简单的测试文件来完全做到这一点:

#include <arpa/inet.h>

我将以上内容保存为 C 文件并尝试用 gcc -E test.c > /dev/null 编译它。输出是这样的:

In file included from /usr/local/include/sys/socket.h:33,
                 from /usr/local/include/netinet/in.h:23,
                 from /usr/local/include/arpa/inet.h:22,
                 from test.c:1:
/usr/local/include/bits/socket.h:390:10: fatal error: asm/socket.h: No such file or directory
  390 | #include <asm/socket.h>
      |          ^~~~~~~~~~~~~~
compilation terminated.

这告诉我 arpa/inet.h 的依赖项之一正在导入 asm/socket.h 但找不到它。

到达这里后,我想确保 gcc 正在寻找 header 的正确位置,然后再继续。幸运的是,文档中有一个 page 对此进行了解释。

运行,

cpp -v /dev/null -o /dev/null

我在输出中得到了以下内容:

...
#include <...> search starts here:
 /usr/local/include
 /usr/include
End of search list.
...

/usr/local/include 确实是我的 header 文件所在的位置。回答第二个问题,不,我在其他地方没有 asm/socket.h。谷歌搜索我发现它应该包含在 linux 源 header 文件中,通常在分发包中找到。

因为我在使用 chromebrew,所以我需要 运行 crew install linuxheaders 才能得到它们。

这就是我回答第三个问题的方式。通过安装软件包 configure 能够 运行 并生成 make 文件,我能够构建和安装 openfortivpn.

希望这对以后的人(可能是我自己)有用。

Were was ./configure looking for the headers?

./configure 脚本调用了编译器,而编译器又在搜索包含路径。编译器包含路径依赖于系统和环境 - 请参阅您的编译器和系统文档。

大多数(如果现在不是全部)Linux 发行版遵循 Filesystem Hierarchy Standard, where system C header files are located inside /usr/include and additionally administrator C header files are installed to /usr/local/include. Most probably compiler adds its own custom additional paths - for gcc most importantly C_INCLUDE_PATH 环境变量。

Did I have them somewhere it wasn't finding it?

即使您“拥有”它(文件本身),它也很可能与您的系统不兼容,并且 C 标准库实现中不存在这些符号。最有可能的是,您的系统提供商已经将编译器配置为在系统中查找该文件,因此如果该文件不存在,很可能就是它不存在。

How do I make it find them?

这是一个广泛的问题。如果系统不提供特定接口,则它很可能不存在。有可能使用 system-specific 工具或 system-specific 包管理器安装它。或者你可以自己写实现header提供的接口,提供接口,把你开发的header放在/usr/local/include.

arpa/inet.hPOSIX specification 的一部分。您可以提供自己在 header 中公开的符号的实现,并配置 ./configure 脚本以使用选项或环境变量查找它。