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?