【问题标题】:Can GNU Autotools (Autoconf / Automake) handle Apple Mac Frameworks?GNU Autotools (Autoconf / Automake) 可以处理 Apple Mac 框架吗?
【发布时间】:2021-12-08 00:13:03
【问题描述】:

GNU 自动工具(autoconf 和 automake)的文档解释了如何测试所需库的存在。如果找到该库,autotools 会将其包含在 LIBS 中,以确保任何生成的目标文件都正确链接到它。如果找不到库,autotools 会生成错误消息。

对于库,可以使用以下宏:

AC_SEARCH_LIBS(function, libraries-list, action-if-found, action-if-not-found, extra-libraries)

例如

AC_SEARCH_LIBS([cos], [m], [], [AC_MSG_ERROR([unable to find the cos() function in the math library])])

你如何告诉 GNU autoconf / automake 对特定的 Apple 框架做同样的事情?

我可能可以使用以下方法来检查特定框架是否存在:

AC_CHECK_FILE(file, [action-if-found], [action-if-not-found])

但是我如何告诉 GNU 自动工具以确保我的目标文件链接到特定的 Apple 框架?
(我的程序(用 C 编写)需要链接到 Apple CoreServices 框架。

对于命令行上的手动构建,通常会告诉编译器在哪里找到框架并告诉它链接你的目标文件。

例如

clang -o MyProgram Source.c -F/System/Library/Frameworks -framework CoreServices -L/opt/local/lib -lmpeg2

在涉及 Apple 框架时可以使用 GNU 自动工具吗? 如果没有,有人可以推荐另一种旨在轻松生成用于 Apple Mac 软件开发的 makefile 的工具吗?

【问题讨论】:

  • 我自己没有使用 Apple 系统的经验,但几年前当我厌倦了同时使用 Autotools 和 MSVC 解决方案时,我发现 CMake 是一个可靠的跨平台解决方案。
  • @DevSolar - 感谢您的建议。我一定会尝试cmake。但首先我想弄清楚 GNU Autotools。鉴于 MacOS 是专有操作系统,我怀疑 GNU 不太热衷于将宏添加到特定于 MacOS 的 GNU 自动工具中。

标签: macos autotools


【解决方案1】:

你如何告诉 GNU autoconf / automake 对特定的 Apple 框架做同样的事情?

这都是关于链接选项的,所有 Autotools 处理编译和链接选项的常用方法都在起作用。

如果您正在谈论使用现有的自动工具,那么原则上,您可以在configure 的环境中指定适当的附加链接标志。例如:

LDFLAGS='-framework CoreServices' ./configure

除非有问题的特定自动工具会破坏它,否则./configure 将在执行库检查时使用指定的链接器标志。然后,您不需要对make 重复此操作,或者将其明确包含在Makefile.am 中。

如果您正在编写自动工具,那么您可以做各种各样的事情,从没有特别的事情(根据上述)到自动检测和/或猜测到提供 --with 或 @987654327 @ 选项允许用户选择和激活特定的框架和框架文件夹,并将适当的链接选项传送到make。您不需要编写与其他方式不同的 AC_SEARCH_LIBSAC_CHECK_LIB 调用,但在某些情况下,您可能希望创建一个或多个额外的输出变量来传达框架选择的链接选项。

我知道这有点含糊,但问题也是如此。

【讨论】:

  • 我知道当用户运行 ./configure 时,可以覆盖 configure.ac 中指定的默认值。但这并不能解决我的问题。大多数 Mac 程序(比如我的)都依赖于 Apple 框架。如果在链接阶段未指定它们,则链接将失败。因此,开发人员应在 configure.ac 中指定所需的 Apple 框架。看起来这样做的唯一方法是在 Makefile.am 中使用 AM_LDFLAGS (请参阅上面的答案)。还应该使用 configure.ac 中的宏检查框架是否存在。我希望有一个宏能做到这两点!
  • @RobK,我接受希望自动工具内置支持框架,但对于不支持框架的项目,指定 LDFLAGS 是合适的方式来处理这种情况。在这种情况下,这不应被视为压倒一切的默认值——它是添加在特定环境中构建所需或期望的标志。开发人员或configure 选择的标志通过不同的变量进行通信。
  • 无论如何,@RobK,在Makefile.am 中设置AM_LDFLAGS 与在configure.ac 中指定链接器标志不同,并且从字面上无条件地设置系统特定于项目是不合适的不是特定于 Mac 的。正如我在这个答案的第二部分中所描述的,configure 可以被编写来识别 Mac 环境并动态选择框架标志,在命令行或多或少的帮助下。您可以在那里使用 shell 的全部功能,以及宏库。但是没有专门用于框架支持的标准宏。
  • 感谢您的 cmets。我同意通常不适合在 configure.ac 中设置系统特定设置,特别是如果项目设计为在多个平台(Mac、Linux 等)上运行。这不适用于我的项目,因为它依赖于 CoreServices 框架,因此只能在 Mac OS 上运行。不幸的是,Mac 框架不是很便携。我正在寻找一种轻松创建 Makefile 的方法。我将尝试 Autotools 并将 AM_FLAGS 设置为 -framework CoreServices。 (或者,我总是可以使用 Xcode)。
【解决方案2】:

看起来可以告诉 automake 使用特定的 Apple Mac 框架。通过将以下内容添加到 Makefile.am 中来完成:

AM_LDFLAGS = -F/System/Library/Frameworks -framework CoreServices
OR
programname_LDFLAGS = -F/System/Library/Frameworks -framework CoreServices

如果您想检查框架是否确实存在,则必须在 configure.ac 中添加该检查(可能通过使用 AC_CHECK_FILE 宏)。

很糟糕,autotools 没有类似于AC_SEARCH_LIBS 的用于在 configure.ac 中使用的宏,它不仅检查框架是否确实存在,而且还将其添加到变量(例如 FRAMEWORKS 或 AM_LDFLAGS)以供使用用于链接目的的 automake。也许,可以通过创建自己的 M4 宏来完成。 M4 宏非常强大。

附:如上所示,您不需要在AM_LDFLAGS 等中包含-F/System/Library/Frameworks,因为这是Mac 上Framework 的标准搜索路径。 (但如果框架位于非标准位置,则需要包含 -F 标志)。

无论如何,您仍然需要在AM-FLAGS 中包含-framework CoreServices,以确保您的程序正确链接到框架。 (这与添加库标志(例如-lmpeg2)以确保在链接阶段将所需的库链接到您的程序没有什么不同)。运行 ./configure 时,您不应将其留给用户。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-09-10
    • 2021-07-02
    • 1970-01-01
    • 2016-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多