使用libtool在自动工具中使用LDFLAGS

时间:2014-02-17 22:12:07

标签: autotools libtool ldflags

根据操作系统的不同,我在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.am,其中一半以上来自外部库 - 我更喜欢从中心位置控制这些标志。

2 个答案:

答案 0 :(得分: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”时更改它们。

答案 1 :(得分: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替换,环境中的任何用户选项在配置时优先;