Shell脚本创建libwork.a静态库仅生成.o文件的问题原因
故障根因
脚本的核心错误是误用了管道符|,两个层面的逻辑错误直接导致静态库无法生成:
- 管道符的作用是将前序命令的标准输出内容传递给后续命令作为标准输入,但
gcc -c *.c的执行逻辑是直接在磁盘生成与.c文件同名的.o目标文件,运行过程不会向标准输出打印任何可传递的内容,后续的ar命令根本接不到任何有效输入。 - Shell执行管道连接的多条命令时,会并行启动所有命令,不会等待前序命令执行完成再启动后续命令。也就是说ar命令启动时,gcc大概率还没完成编译工作,磁盘上还没有生成对应的.o文件,ar匹配不到任何待归档的目标文件,自然不会生成
libwork.a。
两种执行方式(source加载/直接运行脚本)结果一致是正常现象——这个错误和脚本的执行上下文无关,是命令本身的逻辑错误,两种场景下Shell对管道的处理逻辑完全相同。
修正方法
把管道符替换为逻辑与运算符&&即可,这种写法还能保证只有gcc编译全部成功时,才会执行后续的静态库打包操作,避免打包到残缺的目标文件:
#!/bin/bash gcc -c *.c && ar cr libwork.a *.o
如果需要更严谨的错误处理,也可以写成显式的错误判断版本,还可以按需在打包完成后清理临时生成的.o文件:
#!/bin/bash # 编译失败直接退出,不执行后续流程 gcc -c *.c || exit 1 ar cr libwork.a *.o # 可选:清理中间目标文件 rm -f *.o
内容的提问来源于stack exchange,提问作者Leuel Asfaw
相关产品推荐
相关产品推荐

