python - 从 python 脚本调用 gcc 给我 'Undefined symbols: "_main"

标签 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(),有和没有我能想到的所有可能的参数组合,仍然是同样的问题。

有人知道我的问题是什么吗?

最佳答案

改变这个

outfile.close;

为此:

outfile.close()

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

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

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

关于python - 从 python 脚本调用 gcc 给我 'Undefined symbols: "_main",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4293297/

相关文章:

python - 从两个 Pandas 字段创建字典字段

c - 消息队列的问题

c - 我程序中的段错误

python - 如何将数据 append 到存储在 HDFStore 文件中的面板

python - 避免在嵌套循环python中重复

C-2 if 语句中的条件

android - arm64和aarch64的区别

c - 用于 Linux 的 C 应用程序的运行时配置

C:如何实现动态函数复制?

python - 无法使用 plt.plot() 从散点图中删除连接线