1

我正在尝试使用 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 包。缺少什么?我必须解决这个问题,因为程序的主要语言是世界语!

4

1 回答 1

3

我花了一些时间(可能太多)玩这个,我已经设法让它建立起来。

在 Ubuntu 12.04 上,它可以毫无问题地构建开箱即用的文件,查找和使用 GNU gettext。 .tar.gz在 Cygwin 上,我遇到与您相同的错误。

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

在弄乱了configure脚本之后,我想出了以下解决方法:

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

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

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

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

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

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

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

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

是的,那是世界语;谷歌翻译将它翻译成,但并不完全成功,

Files successfully procezitaj: 0 (domaĝe!)

我在本地 Git 存储库中保存了我的修改丑陋的 hack。这是输出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,正常构建和安装,您应该一切顺利。

你可能想就这个问题联系维护人员;我确信他们想要实施比这更清洁的解决方案。

于 2012-08-07T05:01:51.220 回答