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?
- 1150 megtekintés
Hozzászólások
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 hozzászóláshoz be kell jelentkezni
A flush volt a megoldás, köszönöm. Így benézni ezt a dolgot... :-(
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.
- A hozzászóláshoz be kell jelentkezni
system() ?
- A hozzászóláshoz be kell jelentkezni
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...
- A hozzászóláshoz be kell jelentkezni
Köszönöm mindenkinek a választ, megoldódott a dolog.
- A hozzászóláshoz be kell jelentkezni
Törülve
- A hozzászóláshoz be kell jelentkezni