gpt4 book ai didi

windows - 在 Windows : why cygwin can't recognize gettext? 上编译

转载 作者:可可西里 更新时间:2023-11-01 11:35:38 27 4
gpt4 key购买 nike

我正在尝试使用 cygwin 在 Windows 上编译 enc2ly ( http://enc2ly.sourceforge.net/en/ ),但它会出错。当我键入 ./configure 时,结果如下:

checking for a BSD-compatible install... /usr/bin/install -c  
checking whether build environment is sane... yes
checking for a thread-safe mkdir -p... /usr/bin/mkdir -p
checking for gawk... gawk
checking whether make sets $(MAKE)... yes
checking build system type... i686-pc-cygwin
checking host system type... i686-pc-cygwin
checking for gcc... gcc
checking whether the C compiler works... yes
checking for C compiler default output file name... a.exe
checking for suffix of executables... .exe
checking whether we are cross compiling... no
checking for suffix of object files... o
checking whether we are using the GNU C compiler... yes
checking whether gcc accepts -g... yes
checking for gcc option to accept ISO C89... none needed
checking for style of include used by make... GNU
checking dependency style of gcc... gcc3
checking whether NLS is requested... yes
checking for msgfmt... /usr/bin/msgfmt
checking for gmsgfmt... /usr/bin/msgfmt
checking for xgettext... /usr/bin/xgettext
checking for msgmerge... /usr/bin/msgmerge
checking for ld used by GCC... /usr/i686-pc-cygwin/bin/ld.exe
checking if the linker (/usr/i686-pc-cygwin/bin/ld.exe) is GNU ld... yes
checking for shared library run path origin... done
checking how to run the C preprocessor... gcc -E
checking for grep that handles long lines and -e... /usr/bin/grep
checking for egrep... /usr/bin/grep -E
checking for CFPreferencesCopyAppValue... no
checking for CFLocaleCopyCurrent... no
checking for GNU gettext in libc... no
checking for iconv... yes
checking for working iconv... yes
checking how to link with libiconv... -liconv
checking for GNU gettext in libintl... yes
checking whether to use NLS... yes
checking where the gettext function comes from... external libintl
checking how to link with libintl... -lintl
checking for ANSI C header files... yes
checking for sys/types.h... yes
checking for sys/stat.h... yes
checking for stdlib.h... yes
checking for string.h... yes
checking for memory.h... yes
checking for strings.h... yes
checking for inttypes.h... yes
checking for stdint.h... yes
checking for unistd.h... yes
checking for stdlib.h... (cached) yes
checking for string.h... (cached) yes
checking for error_at_line... yes
checking for memset... yes
checking for strstr... yes
configure: creating ./config.status
config.status: creating Makefile
config.status: creating dok/Makefile
config.status: creating iloj/Makefile
config.status: creating kod/Makefile
config.status: creating enc2ly.spec
config.status: creating enc2ly.lsm
config.status: creating po/Makefile.in
config.status: creating config.h
config.status: executing depfiles commands
config.status: executing po-directories commands
config.status: creating po/POTFILES
config.status: creating po/Makefile

当我键入 make 时,它失败了。我怀疑问题出在这里:

checking for CFPreferencesCopyAppValue... no  
checking for CFLocaleCopyCurrent... no
checking for GNU gettext in libc... no

那么,缺少哪些包?或者是另一回事?无论如何谢谢。

--------------------编辑------------------------ -

我使用了 ./configure --disable-nls 并且它有效。所以问题真的是gettext。

checking for GNU gettext in libc... no  

我已经安装了 gettext 包。少了什么?我必须解决这个问题,因为程序的主要语言是世界语!

最佳答案

我花了一些时间(可能太多了)来研究这个,并且我已经成功地构建了它。

在 Ubuntu 12.04 上,它构建出 box .tar.gz 文件没有问题,找到并使用 GNU gettext。在 Cygwin 上,我遇到了与您相同的错误。

一个区别是在Cygwin上,使用gettext的程序需要用-lintl链接;在 Ubuntu 上,它没有(显然 gettext 在标准 C 库中)。

在对 configure 脚本进行了一番折腾之后,我想到了以下解决方法:

首先,在调用./configure 之前,将环境变量$LIBS 设置为"-lintl"

其次,似乎是 Ubuntu 库而非 Cygwin 库提供了一个未记录的符号 _nl_domain_bindingsconfigure 生成的小测试程序依赖于该符号.所以我破解了 configure 脚本,在生成的 C 测试程序中注释掉对 _nl_domain_bindings 的引用。

黑客配置不是解决这个问题的正确方法; configure 脚本由其他工具生成(在源代码发布之前)。您需要熟悉 GNU autoconf 的人提出更好的解决方案。并且 configure 应该 能够自行检测是否需要 -lintl 选项。

这里确实有些奇怪:-lintl 在源代码树中唯一出现的是 enc2ly-0.2/m4/gettext.m4 中的以下行:

    LIBS=`echo " $LIBS " | sed -e 's/ -lintl / /' -e 's/^ //' -e 's/ $//'`

它通过删除任何出现的-lintl来修改$LIBS。如果有一些评论可以解释这一点,那可能是世界语。 (从没想过我会这么说,除非是开玩笑。)

所以我注释掉了那一行,它起作用了,生成了一个 enc2ly.exe 文件,如果我不带参数调用它,它至少会打印一条用法消息:

$ /usr/local/apps/enc2ly-0.2/bin/enc2ly.exe 
Dosieroj sukcese procezitaj: 0 (domaĝe!)
$

是的,那是世界语;谷歌翻译将它翻译成

Files successfully procezitaj: 0 (domaĝe!)

我将我的 修改 丑陋的 hack 保存在本地 Git 存储库中。这是 git diff 的输出:

diff --git a/configure b/configure
index 1605a50..8d1a1b7 100755
--- a/configure
+++ b/configure
@@ -5162,12 +5162,12 @@ else
#include <libintl.h>
$gt_revision_test_code
extern int _nl_msg_cat_cntr;
-extern int *_nl_domain_bindings;
+/* extern int *_nl_domain_bindings; */
int
main ()
{
bindtextdomain ("", "");
-return * gettext ("")$gt_expression_test_code + _nl_msg_cat_cntr + *_nl_domain_bindings
+return * gettext ("")$gt_expression_test_code + _nl_msg_cat_cntr /* + *_nl_domain_bindings */
;
return 0;
}
diff --git a/m4/gettext.m4 b/m4/gettext.m4
index f84e6a5..6c77c3a 100644
--- a/m4/gettext.m4
+++ b/m4/gettext.m4
@@ -247,7 +247,7 @@ return * gettext ("")$gt_expression_test_code + _nl_msg_cat_cntr + *_nl_expand_a
USE_INCLUDED_LIBINTL=yes
LIBINTL="ifelse([$3],[],\${top_builddir}/intl,[$3])/libintl.[]gt_libtool_suffix_prefix[]a $LIBICONV $LIBTHREAD"
LTLIBINTL="ifelse([$3],[],\${top_builddir}/intl,[$3])/libintl.[]gt_libtool_suffix_prefix[]a $LTLIBICONV $LTLIBTHREAD"
- LIBS=`echo " $LIBS " | sed -e 's/ -lintl / /' -e 's/^ //' -e 's/ $//'`
+# LIBS=`echo " $LIBS " | sed -e 's/ -lintl / /' -e 's/^ //' -e 's/ $//'`
fi

CATOBJEXT=

获取 enc2ly-0.2.tar.gz,解压它,应用上述更改(很容易手动完成),将环境变量 $LIBS 设置为 -lintl,正常构建和安装,你应该可以开始了。

您可能想就此问题联系维护人员;我敢肯定他们想要实现比这更清洁的解决方案。

关于windows - 在 Windows : why cygwin can't recognize gettext? 上编译,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11803744/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com