소스에서 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.ver 파일이 생성되는 libgettextpo.exp 파일에 전달합니다.
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가 존재합니다.
또한 버전 2.3 이전에는 grep이 "-e" 플래그를 사용할 수 없다고 들었습니다. grep 버전 3.11이 있습니다.
========업데이트 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