g++ meghívása C++ programon belülről

 ( robert | 2007. szeptember 3., hétfő - 18:13 )

Sziasztok,

A következő problémám van: Szeretnék egy C++/Qt4-ben írt programból generált C++-forrást on-the-fly lefordítani, majd megosztott programkönyvtárként betölteni.
Ez azt jelenti, hogy a C++-kódból szeretném meghívni a következő parancsokat:

g++ -Wall -g -c -o model.o New_layout.cpp
g++ -g -shared -Wl,-soname,model.so -o model.so model.o -lc

Ehhez a Qt4 QProcess osztályát használtam fel, valami ilyesmi módon:

    QString gppCommand = "g++";
    QString command = "make";

    QStringList arguments;
    arguments << "-fPIC";
    arguments << "-Wall";
    arguments << "-g";
    arguments << "-c";
    arguments << "-o";
    arguments << "model.o";
    arguments << "New_layout.cpp";

    QProcess::execute( gppCommand, arguments );

... és ehhez teljesen hasonló módon a második parancs esetén is.
A probléma az, hogy az első parancs nem fut le rendesen, mert létrejön ugyan egy 680B méretű model.so, de az igazi méret 53.1KB kellene legyen (és persze ezután nem is találja a meg a szimbólumot a QLibrary::resolve() (ami nagyjából a dlopen API megfelelő parancsa Qt alatt).

Ha a model.o-t parancssorból generálom, és csak a második parancsot futtatom a programon belülről, akkor minden rendben, megvannak a szimbólumaim is.

A fura az, hogy a nyomorult fordítási parancs prograból futtatva sem jelez hibát (üres a stdOut, üres a stdErr, a visszatérési érték nulla...).

Gondoltam arra, hogy OK, fordításról van szó, nyilván a preprocesszornak kell valami temp könyvtár, definiáljunk hát egyet neki (TMPDIR változó megfelelően kitöltve, átadva az új processznek) - nem segít...

OK, francba a temp könyvtárral, próbáljuk ki a g++ -pipe opcióját! Ez sem segít...

Kipróbáltam azt, hogy a QProcess-t lecserélem a sima cstdlib-beli system()-re - ugyanúgy viselkedik.

Valakinek van ötlete, mivel a fene történik itt?

Hozzászólás megjelenítési lehetőségek

A választott hozzászólás megjelenítési mód a „Beállítás” gombbal rögzíthető.

Pár tipp:
Mágikus sleep(1) a két parancs között?
Ha csak az elsőt futtatod a progiból, az ugyanazt a .o-t készíti, mint kézzel futtatva?
A .cpp fájlt tuti jól létrehozod addigra (fájlleíró lezárva, de legalábbis flusholva a külső progi indítása előtt)?
A QProcess::execute a doksija szerint megvárja az indított progi befejeződését?

A flush volt a megoldás, köszönöm. Így benézni ezt a dolgot... :-(

Idézet:
A QProcess::execute a doksija szerint megvárja az indított progi befejeződését?

Igen, többek között ezért is esett erre a választásom.

system() ?

Probald ki kozvetlenul, egy paranccsal lekrealni a *.so-t:

g++ -g -o akarmi.so -shared akarmi.c

Elvileg ez ekvivalens azzal amit irtal, de ki tudja...

Köszönöm mindenkinek a választ, megoldódott a dolog.

Törülve