在 WSL 上交叉编译时如何处理 `configure.ac` 中的文件存在检查

问题描述 投票:0回答:2

我正在开发一个项目,需要根据某些文件的存在进行条件编译,专门用于集成IPOPT(一个优化库)。我的开发环境是 Windows Subsystem for Linux (WSL),我面临交叉编译的挑战。

在我的

configure.ac
中,我有一个自定义宏
IPOPT_ARG_CHECK
,它检查
IpStdCInterface.h
是否存在,作为确定是否使用 IPOPT 支持进行编译的一部分。这是宏的相关部分:

AC_DEFUN([IPOPT_ARG_CHECK],
[
    ...
    AC_ARG_WITH([$1],
       [AS_HELP_STRING([--$2],
         [IPOPT installation directory @<:@default=check@:>@])],
       [$1=$withval],
       [$3=no])

    AS_IF([test "x$$3" = xno],
          [...],
          [AC_CHECK_FILE($$1/include/$coin/IpStdCInterface.h,
                         [],
                         [AC_MSG_FAILURE([--$2 option was specified but does not seem to point at a valid IPOPT installation])])])

    AM_CONDITIONAL([$8],[test "x$$3" != xno])
    ...
])

但是,当我运行时,我收到警告

autoreconf

configure.ac:242:警告:交叉编译时无法检查文件是否存在

我正在寻找有关以交叉编译友好的方式执行此检查的规范方法的指导。

windows-subsystem-for-linux autotools autoconf m4 autoreconf
2个回答
1
投票

我理解

AC_CHECK_FILE
不建议用于交叉编译场景。根据建议(这里这里),我用一个简单的
test -f
检查替换了它:

AS_IF([test -f "$$1/include/$coin/IpStdCInterface.h"],
      [AC_MSG_RESULT([found])],
      [AC_MSG_RESULT([not found])
       AC_MSG_ERROR([--$2 option was specified but does not seem to point at a valid IPOPT installation])])

问题就解决了。

但是,我相信以交叉编译友好的方式执行此检查的规范方法是使用 pkg-config 系统中的

IPOPT_ARG_CHECK
宏重写
PKG_CHECK_MODULES
函数。这似乎是处理
configure.ac
中的依赖关系的更强大和更常见的方法,特别是对于交叉编译场景。该宏检查包及其版本是否存在,并相应地设置
CFLAGS
LIBS
变量,然后可以在 Makefile 中使用这些变量。

P.S.我已经在问题中提到过这种方法是一次失败的尝试,但后来我意识到我有一个语法错误,通过修复它,这个方法起作用了。我还写了有关此解决方案的文章here


0
投票

我正在开发一个项目,需要根据某些文件的存在进行条件编译,特别是为了集成IPOPT(一个优化库)。 [...]我面临交叉编译的挑战。

在这种特殊情况下,那是因为你以一种无益的方式来描述问题。您不只是想一般性地检查文件。相反,您想要检查是否已配置工作(用于您的目的)IPOPT 库。您应该通过

AC_CHECK_HEADER
AC_CHECK_LIB
etc 来完成此操作,而不是通过
AC_CHECK_FILE

如果您已经执行此类检查,则不需要您的

AC_CHECK_FILE
。如果你没有执行它们,那么你可能应该执行它们。特别是为了良好的交叉编译支持,因为这些将验证配置的库是否与您的交叉工具链兼容。

AC_CHECK_FILE
几乎从来都不是适合这项工作的工具。任何工作。

© www.soinside.com 2019 - 2024. All rights reserved.