根据操作系统的不同,我在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
,其中一半以上来自外部库 - 我更喜欢从中心位置控制这些标志。
答案 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
替换,环境中的任何用户选项在配置时优先; 1}}的覆盖时间仍然是可能的。