如何、何时、何地设置 libtool 的脚本变量? (例如 hardcode_minus_L)
How, when, where to set script variables of libtool? (e.g. hardcode_minus_L)
长话短说:我从事 relative rpath linking with this script (that uses automake、autoconf、libtool)。
问题是二进制可执行文件或 so
文件中的最终 rpath
/runpath
条目仍然具有绝对路径:
- 事实证明,libtool 默认配置为 hardcode_libdir_flag_spec 以包含任何
-L
值(如果它在 LDFLAGS
中设置)
唯一的问题仍然存在:我可以如何以及在什么时候(什么是正确的方法)设置其他 libtool 变量,例如 hardcode_minus_L
。 (我在网上找过,没找到。)
我尝试执行以下操作:
- 在 configure 被调用后,我尝试在
libtool
文件(在正确的目录中)中用 sed
替换变量的值:它有效但是当 make
被称为它再次覆盖了整个 libtool
文件(它被重新生成)
注意,2 个二进制文件受此影响,条目 rpath
/runpath
和 objdump -p
:
- libcurl.so :
RUNPATH /home/user1/lib/rtorrent-0.9.7-1.5.3/lib:$ORIGIN/../lib
- rtorrent :
RUNPATH $ORIGIN/../lib:/home/user1/lib/rtorrent-0.9.7-1.5.3/lib
谢谢
我不知道修改生成的 libtool
脚本是否是解决您问题的最佳方法。但是如果你这样做,你需要通过在 AC_CONFIG_COMMANDS
.
中执行你的 sed
命令来使方法更健壮
libtool
脚本是在 config.status 期间作为配置命令生成的 (AC_CONFIG_COMMANDS
: https://www.gnu.org/software/autoconf/manual/autoconf.html#Configuration-Commands)。
config.status: executing libtool commands
您可以通过添加另一个 AC_CONFIG_COMMANDS
来修改此生成的文件。
我们使用以下方法来改变 prefer_static_libs
变量:
AC_CONFIG_COMMANDS([libtool-fix-linker-preference],
[${SED} -e '1,/prefer_static_libs=/ s/prefer_static_libs=.*$/prefer_static_libs=yes/' \
libtool > libtool.fix && mv libtool.fix libtool])
您需要在 LT_INIT
之后触发您的 AC_CONFIG_COMMANDS
。
configure/config.status 报告执行:
config.status: executing libtool commands
config.status: executing libtool-fix-linker-preference commands
希望对您有所帮助,
克里斯蒂安
事实证明,在 configure.ac
中修改这些变量相当容易,不需要 sed
- 在摆弄并查看生成的脚本之后。唯一令人困惑的是这些变量可以应用于
tags
在给定项目中定义。
例如要在 rtorrent
项目中将 hardcode_libdir_flag_spec
更改为空值(意味着它会破坏编译),您将插入到 configure.ac
:
_LT_TAGVAR(hardcode_libdir_flag_spec, )=""
_LT_TAGVAR(hardcode_libdir_flag_spec, CXX)=""
_LT_TAGVAR(hardcode_minus_L, )=yes
_LT_TAGVAR(hardcode_minus_L, CXX)=yes
第二个参数是 tag
或 default
标签,如果它是空的。
长话短说:我从事 relative rpath linking with this script (that uses automake、autoconf、libtool)。
问题是二进制可执行文件或 so
文件中的最终 rpath
/runpath
条目仍然具有绝对路径:
- 事实证明,libtool 默认配置为 hardcode_libdir_flag_spec 以包含任何
-L
值(如果它在LDFLAGS
中设置)
唯一的问题仍然存在:我可以如何以及在什么时候(什么是正确的方法)设置其他 libtool 变量,例如 hardcode_minus_L
。 (我在网上找过,没找到。)
我尝试执行以下操作:
- 在 configure 被调用后,我尝试在
libtool
文件(在正确的目录中)中用sed
替换变量的值:它有效但是当make
被称为它再次覆盖了整个libtool
文件(它被重新生成)
注意,2 个二进制文件受此影响,条目 rpath
/runpath
和 objdump -p
:
- libcurl.so :
RUNPATH /home/user1/lib/rtorrent-0.9.7-1.5.3/lib:$ORIGIN/../lib
- rtorrent :
RUNPATH $ORIGIN/../lib:/home/user1/lib/rtorrent-0.9.7-1.5.3/lib
谢谢
我不知道修改生成的 libtool
脚本是否是解决您问题的最佳方法。但是如果你这样做,你需要通过在 AC_CONFIG_COMMANDS
.
sed
命令来使方法更健壮
libtool
脚本是在 config.status 期间作为配置命令生成的 (AC_CONFIG_COMMANDS
: https://www.gnu.org/software/autoconf/manual/autoconf.html#Configuration-Commands)。
config.status: executing libtool commands
您可以通过添加另一个 AC_CONFIG_COMMANDS
来修改此生成的文件。
我们使用以下方法来改变 prefer_static_libs
变量:
AC_CONFIG_COMMANDS([libtool-fix-linker-preference],
[${SED} -e '1,/prefer_static_libs=/ s/prefer_static_libs=.*$/prefer_static_libs=yes/' \
libtool > libtool.fix && mv libtool.fix libtool])
您需要在 LT_INIT
之后触发您的 AC_CONFIG_COMMANDS
。
configure/config.status 报告执行:
config.status: executing libtool commands
config.status: executing libtool-fix-linker-preference commands
希望对您有所帮助,
克里斯蒂安
事实证明,在 configure.ac
中修改这些变量相当容易,不需要 sed
- 在摆弄并查看生成的脚本之后。唯一令人困惑的是这些变量可以应用于
tags
在给定项目中定义。
例如要在 rtorrent
项目中将 hardcode_libdir_flag_spec
更改为空值(意味着它会破坏编译),您将插入到 configure.ac
:
_LT_TAGVAR(hardcode_libdir_flag_spec, )=""
_LT_TAGVAR(hardcode_libdir_flag_spec, CXX)=""
_LT_TAGVAR(hardcode_minus_L, )=yes
_LT_TAGVAR(hardcode_minus_L, CXX)=yes
第二个参数是 tag
或 default
标签,如果它是空的。