ExtUtils :: MakeMaker在空格上拆分PERL_MM_OPT,这意味着以下内容将不起作用。
export PERL_MM_OPT='LIBS="-L/usr/sfw/lib -lssl -lcrypto" INC=/usr/sfw/include'
是否有针对此的已知解决方法,或者我是否必须避免在此方案中使用PERL_MM_OPT?
- 更新 -
mobrule提出了使用制表符而不是空格的优秀建议。 mobrule是关于它只在空间分裂的权利。但是,该解决方案不起作用,因为它看起来像标签被转换为环境变量中的空格。
> cat tmp.sh
export PERL_MM_OPT='LIBS="-L/usr/sfw/lib -lssl -lcrypto" INC=-I/usr/sfw/include'
echo $PERL_MM_OPT | perl -pe 's/\t/[t]/g' | perl -pe 's/ /[s]/g'
> head -1 tmp.sh | perl -pe 's/\t/[t]/g' | perl -pe 's/ /[s]/g'
export[s]PERL_MM_OPT='LIBS="-L/usr/sfw/lib[t]-lssl[t]-lcrypto"[s]INC=-I/usr/sfw/include'
> bash tmp.sh
LIBS="-L/usr/sfw/lib[s]-lssl[s]-lcrypto"[s]INC=-I/usr/sfw/include
- 更新2 -
因此,标签建议有效(我被回声的行为误导,并得出错误的结论,为什么它失败了),但它没有解决问题。
现在问题是ExtUtils / Liblist / Kid.pm不期待领先的双引号(单引号也会出现相同的结果。)
Unrecognized argument in LIBS ignored: '"-L/usr/sfw/lib
所以,似乎这个问题的解决方案(如果存在的话)不能依赖于引号。
答案 0 :(得分:1)
实际上,MakeMaker.pm
在空格上分割,但不在所有空格上分割。你能用标签吗?
export PERL_MM_OPT='LIBS="-L/usr/sfw/libTab-lsslTab-lcrypto" INC=/usr/sfw/include
我认为您使用选项卡设置环境变量的方式是正确的 - 这是将选项卡转换为空格的echo
命令:
$ VAR='abc^Idef'
$ echo $VAR | od -c
0000000 a b c d e f \n
0000010
看起来它不起作用。但是等等:
$ export VAR
$ perl -e 'print $ENV{VAR}' | od -c
0000000 a b c \t d e f
0000007
根据ExtUtils::MakeMaker
中的参数如何传递到子流程(通过$ENV{PERL_MM_OPT}
,system
,{{1}等等):
exec
系统调用1将起作用,因为当open |
调用具有一个具有任何元字符的arg时,它会将命令传递给shell。 shell将正确解析参数。
系统调用2失败,因为多个arg system("gcc helloworld.c -lssl\t-lcrypto\t-L/usr/sfw/lib") ### 1 ###
system("gcc", "helloworld.c", "-lssl\t-lcrypto\t-L/usr/sfw/lib") ### 2 ###
总是绕过shell而system
一直在寻找名称不大system
的库。如果gcc
正在使用此调用样式来运行编译器,则此解决方法将无法完成任务。