使用autoconf链接外部目标文件(.o)

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

出于工作目的,我需要链接到另一个程序生成的目标文件,并在其文件夹中找到,情况是我没有找到有关这种链接的信息。我认为,如果我硬编码路径并将name-of-obj.o放在package_LDADD变量前面应该可行,但情况是我不想这样做。

如果找不到该对象,我希望配置失败并告诉用户缺少name-of-obj.o

我尝试使用AC_LIBOBJ([name-of-obj.o]),但这将尝试在根目录中找到obj.c的名称并编译它。

有关此问题的任何提示或解决方案?

谢谢!

makefile gnu autotools configure autoconf
1个回答
2
投票

我需要链接另一个程序生成的目标文件,并在其文件夹中找到

您所描述的是一个非常不寻常的要求,而不是那些Autotools旨在干净或轻松处理的要求。特别是,Autoconf没有专门适用于搜索裸目标文件的机制,而不是库,而Automake在链接时没有特别自动化包含这些对象。然而,这些工具确实具有足够的通用功能来完成您想要的任务;它不会像你想的那样整洁。

我认为,如果我硬编码路径并将name-of-obj.o放在package_LDADD变量前面应该可行,但情况是我不想这样做。

我认为它是你想要避免的“硬编码路径”部分。将项添加到适当的LDADD变量是不可协商的;这是将对象包含在链接中的正确方法。

如果找不到该对象,我希望配置失败并告诉用户缺少name-of-obj.o。

那么,关键的事情似乎是让configure执行搜索你的目标文件。 Autoconf没有内置的机制来执行这样的搜索,但它只是一个基于宏的shell脚本生成器,所以你可以在shell脚本+ Autoconf中编写这样的搜索,可能是这样的:

AC_MSG_CHECKING([for name-of-obj.o])
OTHER_LOCATION=
for my_dir in
    /some/location/other_program/src
    /another/location/other_program.12345/src
    $srcdir/../relative/location/other_program/src; do
  AS_IF([test -r "${my_dir}/name-of-obj.o"], [
    # optionally, perform any desired test to check that the object is usable
    # ... perhaps one using AC_LINK_IFELSE ...
    # if it passes, then
    OTHER_LOCATION=${my_dir}
    break
  ])
done

# Check whether the object was in fact discovered, and act appropriately
AS_IF([test "x${OTHER_LOCATION}" = x], [
  # Not found
  AC_MSG_RESULT([not found])
  AC_MSG_ERROR([Cannot configure without name-of-obj.o])
], [
  AC_MSG_RESULT([${OTHER_LOCATION}/name-of-obj.o])
  AC_SUBST([OTHER_LOCATION])
])

这是功能性的,但当然你可以修饰,例如通过提供包构建器来指定通过命令行参数(AC_ARG_WITH(...))使用的位置。如果你想为多个对象执行此操作,那么您可能希望将其中的一部分包装到自定义宏中。

Automake方面的参与程度要低得多。要使对象链接,您只需使用上面创建的输出变量将其添加到相应的LDADD变量,例如:

foo_LDADD = $(OTHER_LOCATION)/name-of-obj.o

请注意,如果您只构建一个程序目标,那么您可以使用通用LDADD而不是foo_LDADD,但请注意,默认情况下这些是替代而非补充。


话虽如此,这总体上是一个坏主意。如果要链接不属于项目的内容,则应从已安装的库中获取。当然,这可以是一个本地的,定制的库,只要它是一个库,而不是一个裸目标文件,并且它已经安装。如果您不想依赖或分发单独的共享库,它可以是静态库。

另一方面,如果您的项目是更大版本的一部分,那么最好的方法可能是将其集成到该构建中,可能作为子项目。链接库而不是裸目标文件仍然是最好的,但在子项目上下文中,使用未安装到构建系统的库可能是有意义的。结合命令行参数,告诉它在哪里找到想要的lib,这可以使所需的Autoconf代码更清晰,更清晰。

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