1

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

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,但我已确保它在 libtool 命令中通过运行make -n.

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

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

4

2 回答 2

4

Libtool 有一个-no-undefined选项。

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

您应该让 libtool 从Makefile.am中了解它,并让它负责转发到链接器:

配置.ac

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

生成文件.am

AM_LDFLAGS = $(EXTRA_LDFLAGS) ...

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

于 2014-02-18T04:04:41.893 回答
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 time with 覆盖make LDFLAGS=...仍然是可能的。

于 2014-02-24T10:05:29.660 回答