出于工作目的,我需要链接由另一个程序生成并在其文件夹中找到的目标文件,这种情况是我没有找到有关这种链接的信息。我认为,如果我对路径进行硬编码并将name-of-obj.o
放在package_LDADD
变量前面应该可以,但是这种情况是我不想那样做。
如果找不到该对象,我希望配置失败并告诉用户name-of-obj.o
丢失。
我尝试使用AC_LIBOBJ([name-of-obj.o])
,但这将尝试在根目录中找到obj.c名称并进行编译。
有关此问题的任何提示或解决方案?
谢谢!
答案 0 :(得分:2)
我需要链接到另一个程序生成的目标文件,并且 在其文件夹中找到
您所描述的是一个非常不寻常的要求,而不是Autotools旨在干净或轻松处理的要求。尤其是,与库相比,Autoconf没有专门适用于搜索裸对象文件的机制,而Automake在链接时并没有特别的自动化来围绕此类对象。但是,这些工具确实具有足够的通用功能来满足您的需求。只是不会像您想要的那样整洁。
我认为,如果我对路径进行硬编码并放入
name-of-obj.o
变量前面的package_LDADD
应该可以,但是 情况是我不想那样做。
我认为这是您要避免的“硬编码路径”部分。不能将项目添加到适当的LDADD
变量中;这是使对象包含在链接中的正确方法。
如果找不到该对象,我希望配置失败并告诉 用户,缺少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
,但是请注意,默认情况下,这些是替代品,而不是补充。
话虽如此,这总体上是个坏主意。如果要链接不属于项目的内容,则应从已安装的库中获取。当然,它可以是本地的,自定义构建的库,只要它是库而不是裸对象文件并已安装即可。如果您不想依赖或分发单独的共享库,则它可以是静态库。
另一方面,如果您的项目是较大版本的一部分,则最好的方法可能是将其集成到该版本中,或者作为子项目。仍然最好链接库而不是裸对象文件,但是在子项目上下文中,使用未安装到构建系统的库可能是有意义的。结合一个命令行参数,告诉它在哪里可以找到所需的库,这可以使所需的Autoconf代码更加清晰明了。