构建 gettext 时 VERSION 文件中出现意外语法错误

构建 gettext 时 VERSION 文件中出现意外语法错误

我正在尝试从源代码构建 gettext 包。

运行时make我收到错误:

make[5]: Entering directory '/source/gettext-0.22/gettext-tools/libgettextpo'
[..........]
libtool: link:  gcc -shared  -fPIC -DPIC  -Wl,--whole-archive ./.libs/libgnu.a -Wl,--no-whole-archive  -lc  -g -O2   -Wl,-soname -Wl,libgettextpo.so.0 -Wl,-version-script -Wl,.libs/libgettextpo.ver -o .libs/libgettextpo.so.0.5.9
/usr/bin/ld:.libs/libgettextpo.ver:2: syntax error in VERSION script
collect2: error: ld returned 1 exit status
make[5]: *** [Makefile:4012: libgettextpo.la] Error 1
make[5]: Leaving directory '/source/gettext-0.22/gettext-tools/libgettextpo'
[............]
make: *** [Makefile:362: all] Error 2

该错误消息暗示我在一个特定文件的第 2 行存在某种语法错误,因此我继续检查提到的文件:

root:/source/gettext-0.22# cat gettext-tools/libgettextpo/.libs/libgettextpo.ver
{ global:
local: *; };

=========更新========

作为钢铁起子建议,.ver 文件由“make”命令自动生成。这是输出的一部分,负责:

libtool: link: /usr/bin/nm -B   ./.libs/libgnu.a | /usr/bin/sed -n -e 's/^.*[    ]\([ABCDGIRSTW][ABCDGIRSTW]*\)[     ][  ]*\([_A-Za-z][_A-Za-z0-9]*\)$/\1 \2 \2/p' | /usr/bin/sed '/ __gnu_lto/d' | /usr/bin/sed 's/.* //' | sort | uniq > .libs/libgettextpo.exp
libtool: link: /usr/bin/grep -E -e "^([^l]|l[^i]|li[^b]|lib[^g]|libg[^e]|libge[^t]|libget[^t]|libgett[^e]|libgette[^x]|libgettex[^t]|libgettext[^p]|libgettextp[^o]|libgettextpo[^_]|libgettextpo_version).*" ".libs/libgettextpo.exp" > ".libs/libgettextpo.expT"
libtool: link: mv -f ".libs/libgettextpo.expT" ".libs/libgettextpo.exp"
libtool: link: echo "{ global:" > .libs/libgettextpo.ver
libtool: link:  cat .libs/libgettextpo.exp | /usr/bin/sed -e "s/\(.*\)/\1;/" >> .libs/libgettextpo.ver
libtool: link:  echo "local: *; };" >> .libs/libgettextpo.ver

如果我正确理解日志,make 会从 libgnu.a 文件中提取符号,根据某种正则表达式过滤它们,然后将它们传递到 libgettextpo.exp 文件,从中创建最终的 libgettextpo.ver 文件。

libgnu.a 文件似乎是正确的:

root:/source/gettext-0.22/gettext-tools/libgettextpo/.libs# nm -B libgnu.a

asnprintf.o:
                 U __stack_chk_fail
0000000000000000 T libgettextpo_asnprintf
                 U libgettextpo_vasnprintf

fopen.o:
                 U __errno_location
                 U __stack_chk_fail
                 U close
                 U fdopen
                 U fopen
0000000000000000 T libgettextpo_rpl_fopen
                 U memcpy
                 U open
                 U strlen

printf-args.o:
0000000000000000 r .LC0
0000000000000000 T libgettextpo_printf_fetchargs
00000000000000c0 r wide_null_string.0

printf-parse.o:
                 U __errno_location
                 U free
0000000000000000 T libgettextpo_printf_parse
                 U malloc
                 U memcpy
                 U realloc

vasnprintf.o:
                 U __errno_location
                 U __stack_chk_fail
                 U abort
                 U free
                 U libgettextpo_printf_fetchargs
                 U libgettextpo_printf_parse
0000000000000000 T libgettextpo_vasnprintf
0000000000000000 t libgettextpo_vasnprintf.cold
                 U malloc
                 U memcpy
                 U realloc
                 U snprintf

然而,libgettextpo.exp 文件为空
因此,问题一定出在这两行上:

libtool: link: /usr/bin/nm -B   ./.libs/libgnu.a | /usr/bin/sed -n -e 's/^.*[    ]\([ABCDGIRSTW][ABCDGIRSTW]*\)[     ][  ]*\([_A-Za-z][_A-Za-z0-9]*\)$/\1 \2 \2/p' | /usr/bin/sed '/ __gnu_lto/d' | /usr/bin/sed 's/.* //' | sort | uniq > .libs/libgettextpo.exp
libtool: link: /usr/bin/grep -E -e "^([^l]|l[^i]|li[^b]|lib[^g]|libg[^e]|libge[^t]|libget[^t]|libgett[^e]|libgette[^x]|libgettex[^t]|libgettext[^p]|libgettextp[^o]|libgettextpo[^_]|libgettextpo_version).*" ".libs/libgettextpo.exp" > ".libs/libgettextpo.expT"

我检查了我的系统上是否存在这两行中使用的命令。存在 sort、uniq 和 /usr/bin/sed。
我还听说 grep 在 2.3 版本之前无法使用“-e”标志。我有 3.11 版本的 grep。

========更新2======== 我尝试手动复制此过程并发现,生成空文件的命令是这样的:

root:/source/gettext-0.22/gettext-tools/libgettextpo# /usr/bin/grep -E -e "^([^l]|l[^i]|li[^b]|lib[^g]|libg[^e]|libge[^t]|libget[^t]|libgett[^e]|libgette[^x]|libgettex[^t]|libgettext[^p]|libgettextp[^o]|libgettextpo[^_]|libgettextpo_version).*" ".libs/libgettextpo.exp" > ".libs/libgettextpo.expT"

测试表明, grep -E -e 按预期工作。我在过滤之前还检查了libgettextpo.exp的内容,结果是这样的:

libgettextpo_asnprintf
libgettextpo_printf_fetchargs
libgettextpo_printf_parse
libgettextpo_rpl_fopen
libgettextpo_vasnprintf

事实证明,这两个字符串都不匹配构建过程中指定的正则表达式。由于没有任何内容与正则表达式匹配,因此问题可能出在生成 libgettextpo.exp 文件的 libgnu.a 文件中。以下是 libgnu.a 的编译方式:

/bin/sh ../libtool  --tag=CC   --mode=link gcc  -g -O2 -version-info 5:9:5 -rpath /usr/lib    -lc -no-undefined -export-symbols-regex '^([^l]|l[^i]|li[^b]|lib[^g]|libg[^e]|libge[^t]|libget[^t]|libgett[^e]|libgette[^x]|libgettex[^t]|libgettext[^p]|libgettextp[^o]|libgettextpo[^_]|libgettextpo_version).*'     -o libgettextpo.la -rpath /usr/lib gettext-po.lo ../src/str-list.lo ../src/dir-list.lo ../src/message.lo ../src/pos.lo ../src/msgl-ascii.lo ../src/po-error.lo ../src/po-xerror.lo ../src/write-catalog.lo ../src/write-po.lo ../src/open-catalog.lo ../src/po-charset.lo ../src/po-lex.lo ../src/po-gram-gen.lo ../src/read-po.lo ../src/read-catalog-abstract.lo ../src/read-catalog.lo ../src/plural-table.lo ../src/format-c.lo ../src/format-c++-brace.lo ../src/format-python.lo ../src/format-python-brace.lo ../src/format-java.lo ../src/format-java-printf.lo ../src/format-csharp.lo ../src/format-javascript.lo ../src/format-scheme.lo ../src/format-lisp.lo ../src/format-elisp.lo ../src/format-librep.lo ../src/format-ruby.lo ../src/format-sh.lo ../src/format-awk.lo ../src/format-lua.lo ../src/format-pascal.lo ../src/format-smalltalk.lo ../src/format-qt.lo ../src/format-qt-plural.lo ../src/format-kde.lo ../src/format-kde-kuit.lo ../src/format-boost.lo ../src/format-tcl.lo ../src/format-perl.lo ../src/format-perl-brace.lo ../src/format-php.lo ../src/format-gcc-internal.lo ../src/format-gfc-internal.lo ../src/format.lo ../src/plural-exp.lo ../src/plural-eval.lo ../src/msgl-check.lo ../src/sentence.lo  libgnu.la  
libtool: link: rm -fr  .libs/libgettextpo.exp .libs/libgettextpo.ver

相关内容