Вызов gcc из скрипта python дает мне неопределенные символы: «_main» - PullRequest
1 голос
/ 27 ноября 2010

Я пытаюсь написать скрипт генератора кода на 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, она работает нормально.Я также могу без проблем скомпилировать код непосредственно в оболочке.

Я пробовал разные варианты, используя subprocess.Popen (), subprocess.call (), с и без всевозможных комбинаций аргументов, которые я могу себе представитьиз, все та же проблема.

Кто-нибудь есть какие-либо идеи, в чем может быть моя проблема здесь?

Ответы [ 3 ]

6 голосов
/ 27 ноября 2010

Измените это

outfile.close;

на следующее:

outfile.close()

Вы на самом деле не закрываете файл, поэтому Python не очищает свои буферы, поэтому все, что есть в источникефайл является пустым файломКогда gcc компилирует пустой файл, он жалуется на то, что нет функции main, служащей точкой входа в программу.

Я бы также предложил проверить, что p.returncode равно 0, чтобы убедиться, что gcc был успешным до того, какпопытка выполнить (возможно, несуществующий) выходной двоичный файл.

Также нет необходимости завершать каждую инструкцию точкой с запятой.Точка с запятой нужна только в том случае, если у вас есть несколько операторов в строке, и в этом случае они нужны между операторами.Серверы конца строки в качестве разделителя операторов, если им не предшествует обратная косая черта.

1 голос
/ 27 ноября 2010

Вы на самом деле не звоните outfile.close;это должно быть outfile.close().Вероятно, источник все еще где-то застрял в буфере, а GCC его не видит.

0 голосов
/ 29 ноября 2010

Вы можете избежать этой проблемы, используя with-block для управления файлом:

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

Также обратите внимание, что точки с запятой не требуются в Python, если вы не пишете несколько операторов в одной строке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...