如果 ./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 安装非常不寻常,我对出现某种错误并不感到惊讶,但该消息对于如何修复它根本没有帮助。
所以我的问题是:
./configure
正在寻找 header 吗?
- 我是不是把它们放在了某个地方却找不到?
- 如何让它找到它们?
对于第一个问题,我查看了 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 -x
和 set +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.h
是 POSIX specification 的一部分。您可以提供自己在 header 中公开的符号的实现,并配置 ./configure
脚本以使用选项或环境变量查找它。
所以我最近 运行 在尝试使用 chromeos (chronos).
构建 a program 时遇到了问题我克隆了代表os 并按照指示 运行 ./autogen.sh
。到目前为止没有问题。
但是,当我 运行 ./configure
我收到以下消息:
checking arpa/inet.h usability... no
这告诉我配置脚本无法找到 arpa/inet.h
header 文件,但是它没有告诉我它在寻找什么。
鉴于常规 chrome 安装非常不寻常,我对出现某种错误并不感到惊讶,但该消息对于如何修复它根本没有帮助。
所以我的问题是:
./configure
正在寻找 header 吗?- 我是不是把它们放在了某个地方却找不到?
- 如何让它找到它们?
对于第一个问题,我查看了 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 -x
和 set +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.h
是 POSIX specification 的一部分。您可以提供自己在 header 中公开的符号的实现,并配置 ./configure
脚本以使用选项或环境变量查找它。