【问题标题】:LDFLAGS usage in autotools with libtool使用 libtool 在 autotools 中使用 LDFLAGS
【发布时间】:2014-03-17 09:53:34
【问题描述】:

根据操作系统,我在 configure.ac 中定义了一个特殊的 LDFLAGS

AC_CANONICAL_HOST
if test "$host_os" = cygwin
then
    LDFLAGS="$LDFLAGS -Wl,-no-undefined"
    export LDFLAGS
fi
AC_SUBST([LDFLAGS])

该包使用AC_PROG_LIBTOOL,当LDFLAGS 传递给libtool 时,-Wl 前缀仍然存在,并且链接器不理解该选项。如果我删除此前缀,AC_PROG_CXX 宏将失败,因为 GCC 会自行阻塞-no-undefined。我做错了什么?

LDFLAGS 没有提到 Makefile.am,但我通过运行 make -n 确保它在 libtool 命令中得到尊重。

我在 Cygwin 1.7.28(0.271/5/3) 下使用 autoconf 2.69、automake 1.14、gmake 4.0 和 gcc 4.8.2

编辑:我有几十个Makefile.ams,其中一半以上来自外部库——我更喜欢从中心位置控制这些标志。

【问题讨论】:

  • 应该是-Wl,--no-undefined(注2 -s)而不是-Wl,-no-undefined

标签: autotools libtool ldflags


【解决方案1】:

为了不修改几十个 Makefile,我最终使用了LDFLAGS。诀窍是在AC_PROG_CXX 宏之后设置它:

AC_PROG_CXX
if test "$host_os" = cygwin
then
    LDFLAGS="-no-undefined $LDFLAGS"
fi
AC_SUBST([LDFLAGS])

这样,测试 C++ 编译器的宏会成功,因为 LDFLAGS 是原始的;但实际的代码库使用额外的标志。

通过将$LDFLAGS 替换放在末尾,环境中的任何用户选项在配置时优先;并且仍然可以在生成时使用 make LDFLAGS=... 覆盖。

【讨论】:

  • 从技术上讲,这些都是 hack,因为这些变量的依赖关系和顺序没有记录。在实践中,自动工具是为了完成工作。这很优雅,很高兴知道!
【解决方案2】:

Libtool 有一个-no-undefined 选项。

GNU ld 有一个--no-undefined 选项。

你应该让 libtool 从 Makefile.am 中知道它,并让它负责转发到链接器:

configure.ac

AC_CANONICAL_HOST
if test "$host_os" = cygwin
then
    EXTRA_LDFLAGS="-no-undefined"
fi
AC_SUBST([EXTRA_LDFLAGS])

Makefile.am

AM_LDFLAGS = $(EXTRA_LDFLAGS) ...

作为一般规则,您不应在 configure.ac 中乱用 CPPFLAGS、LDFLAGS 等,因为用户可能需要在调用“make”时更改它们。

【讨论】:

  • 这是正确的 - 留下由 configure 单独获取的环境变量。
  • 我有几十个Makefile.ams 可以匹配^lib 正则表达式(即定义libXXX 变量)。如果可能的话,我仍然更愿意从一个中心位置影响所有这些 makefile,而不是更改每个 Makefile.am。会不会像AC_SUBST([AM_LDFLAGS], "--no-undefined") work? None of those Makefile.ams explicitly set AM_LDFLAGS`...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-26
  • 1970-01-01
  • 1970-01-01
  • 2011-10-29
  • 2013-03-20
  • 2014-04-27
相关资源
最近更新 更多