从python脚本调用gcc给了我未定义的符号:" _main"

时间:2010-11-27 18:52:53

标签: python c gcc code-generation

我正在尝试用Python编写代码生成器脚本,它生成一个C源文件,编译并运行它。但是,我无法从我的脚本中调用gcc。

一个简单的hello world示例:

import subprocess  

basename = "CodeGenTest";  
execname = basename;  
srcname = basename + ".c";  

codeList = [];  
codeList.append("#include <stdio.h>");  
codeList.append("int main(int argc, char *argv[])\n{");  
codeList.append("printf(\"Hello world.\\n\");");  
codeList.append("}");  

# Convert codelist to string.  
codeList.append("");  
codeString = "\n".join(codeList);  

# Print code to output source file  
outfile=open(srcname,'w');  
outfile.write(codeString);  
outfile.close;  

print "Compile.";  
cmd = ["gcc", "-O2", srcname, "-o", execname];  
p = subprocess.Popen(cmd);  
p.wait();  

subprocess.call(["./"+execname]);  

如果我运行此脚本,我会收到以下错误输出

Compile.
Undefined symbols:
  "_main", referenced from:
      start in crt1.10.6.o
ld: symbol(s) not found
collect2: ld returned 1 exit status

如果我在python解释器shell中执行完全相同的操作,它可以正常工作。我也可以在shell中直接编译代码。

我尝试了各种变体,使用subprocess.Popen(),subprocess.call(),我可以想到的所有可能的参数组合,仍然是同样的问题。

任何人都知道这可能是我的问题吗?

3 个答案:

答案 0 :(得分:6)

更改此

outfile.close;

到此:

outfile.close()

你实际上并没有关闭文件,所以Python没有刷新它的缓冲区,因此源文件中的所有内容都是空文件。当gcc编译一个空文件时,它会抱怨没有main函数作为程序的入口点。

我还建议您在尝试执行(可能不存在的)输出二进制文件之前检查p.returncode是否为0以确保gcc成功。

此外,没有必要以分号结束每个语句。如果每行有多个语句,则只需要一个分号,在这种情况下,在语句之间需要它们。当没有反斜杠时,行尾服务器作为语句终止符。

答案 1 :(得分:1)

你实际上并没有打电话给outfile.close;它应该是outfile.close()。很可能源仍然停留在某个缓冲区中,GCC没有看到它。

答案 2 :(得分:0)

您可以使用with-block来管理文件来避免此问题:

with file(srcname, 'w') as outfile: outfile.write(codeString)

另请注意,除非您在同一行上编写多个语句,否则Python中不需要分号。