我正在尝试从源代码构建 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