Subprocess i gcc

0

Witam.
Otóż chciałem napisać sobie drobne narzędzie w pythonie, które miało pokazywać rozmiar podanej w parametrze struktury z języka C.
Poniżej kod z pliku sizeof.py:

import subprocess
import sys


part1 = "#include <stdio.h>\n#include <windows.h>\nint CALLBACK WinMain(HINSTANCE hInstance, HINSTANCE hprevinstance, LPSTR lpCmdLine,int nCmdShow)\n{\n    printf(\"%i\", sizeof("
part2 = "));\n    (void)hInstance;\n    (void)hprevinstance;\n    (void)lpCmdLine;\n    (void)nCmdShow;\n    return 0;\n}"

if len(sys.argv) != 2 or sys.argv[1] == "":
    print("Usage: sizeof <C structure name>\n       Accepts both native C structures and Winapi structures")
    sys.exit();

code = part1 + sys.argv[1] + part2

try:
    file = open("tmp.c", "w")
except IOError:
    print("Failed to open temporary file.")
    sys.exit()

file.write(code)
subprocess.call("make")

Aby skompilować plik wywołuję polecenie make.
Kod z pliku makefile:

all: tmp.c
	gcc -Wall -Wextra -std=c11 tmp.c -o tmp.exe

Niestety linker wyrzuca następujący błąd:
undefined reference to WinMain@16'`
Jeżeli ręcznie wywołam polecenie make, to wszystko działa jak należy. Podejrzewam, że python zmienia coś w konfiguracji środowiska gcc, ale jestem nowy w tym języku, więc nie bardzo wiem, co i jak to poprawić. Z góry dzięki za pomoc.

PS Nie mogłem znaleźć odpowiedniego podświetlania składni. Mam nadzieję, że się nie obrazicie. :)
PPS Oczywiście wszystko robię pod Windows'em.

0
  1. Nie da sie tego zrobić przez pythonowe ctypes?
  2. Jak zrobisz z tego standardowy kod w C czyli taki z int main() to pewnie ruszy.
0

A gdzie szukałeś, pod biurkiem? Rozwiń listę kolorowanie składni albo wpisz <code class="python">

0

@Shalom Na początku miałem właśnie kod z main(), ale treść błędu jakoś mi nasunęła, że może warto to zmienić na WinMain(). Zmieniłem z powrotem na main() i jest dokładnie tak samo. Bez różnicy.

Co do ctypes, to pierwszy raz słyszę o tej bibliotece. Da się dzięki niej sprawdzić rozmiar windows'owych struktur? Na nich najbardziej mi zależy. W każdym razie dzięki za wskazanie tej biblioteki.

0

ctypes pozwala tworzyć struktury zgodne z tymi z C. Można dzięki temu np. prosto wczytać sobie w pythonie binarne dane paczkowane w takie struktury. Możesz tam w zasadzie zrobić wszystko, włącznie z ustawieniem jak pakować pola bitowe i czy ma być little czy big endian ;]
https://docs.python.org/3.5/library/ctypes.html#structures-and-unions

1 użytkowników online, w tym zalogowanych: 0, gości: 1