能否让GCC从管道中读取数据?

70
我正在寻找一个选项来让gcc从标准输入读取源文件,主要是为了可以像这样从类似flex这样的工具生成对象文件,该工具会生成C代码(flex-t选项将生成的C代码写入标准输出):
flex -t lexer.l | gcc -o lexer.o -magic-option-here

因为我并不在意生成的C文件。是否有类似的东西存在,还是我必须使用临时文件?

1
如果您需要调试代码,生成的C文件是有用的。 - laalto
5
那是个很好的观点,但是Flex生成的代码本身就不太容易阅读。 - Zifre
2个回答

86

是的,但是您需要使用-x选项指定语言:

# Specify input file as stdin, language as C
flex -t lexer.l | gcc -o lexer.o -xc -

3
我猜它可能是(许多其他工具使用它),但我在 man 页面中找不到任何关于它的信息... - Zifre
请注意,2019年使用gcc 8.2.1时,此功能最近出现了故障。现在在读取管道时会挂起。 - Todd Freed
@ToddFreed:假设生成源文件的进程正确关闭了其输出,那么这听起来像是GCC中的一个错误。如果您有可重现的测试用例,请向GCC维护人员报告。 - Adam Rosenfield
太好了!谢谢! - pmor
有没有办法为gcc诊断仍然命名文件? - creanion
原来可以使用预处理器指令来为它指定文件名;这个指令可以添加在输入的第一行。 - creanion

22
flex -t lexer.l | gcc -x c -c -o lexer.o -

基本上,你说文件名是-。指定文件名为-是一种表示“标准输入”的标准约定。你还想要-c标志,这样你就不会进行链接。而当GCC从标准输入读取时,你必须使用-x告诉它这是什么语言。-x c表示C代码。

我知道-c是什么,只是为了简单起见而省略了它(因为在flex和gcc上我还有很多其他选项)。 - Zifre

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接