tags:

views:

178

answers:

3

I'm writing a cross-platform C++ program using Qt and I want to package/embed a number of binary executables within the program. The program should be able to execute these binaries at runtime.

I figured, I would need QResource and QProcess using start() and the ":/..." notation, but I don't seem to get the process running. Is there anything I am missing? Should it work like this? Does the binary need to be set as executable?

Background: I am writing a tool which uses Git and I don't want to require the end-user to install Git manually.

(Trying this on Mac OS X, BTW.)

Update:

I am using the following code (C++, Qt on Mac OS X):

QString program = ":/git";
QStringList arguments;
arguments << "help" << "commit";
myProcess->start(program, arguments);

The Git executable is in the project path, my resources.qrc references it like so:

<qresource prefix="/">
    <file>git</file>
</qresource>

I'm not getting an error, but the program is not executed. Behavior is the same when I set program to a non-existing file. Replacing ":/git" by the absolute path to git works perfectly.

+1  A: 

I don't think resources would work. Processes are created by operating system, and resources are handled by application.

One possible solution would be bundle additional executables somewhere in your application directory and execute them from that path.

el.pescado
thank you! can you indicate how you would embed them in the application bundle (osx)? I would like to avoid having an installer - a simple dmg image should be all user would have to download.
A: 

So the problem doesn't seem to be extracting the git executable from the resource so much as executing it?

The git program is generate don disk correctly, can you check it's permissions ?

Martin Beckett
+2  A: 

You can't execute a program directly from a resource.

If you had a program in a resource and you wanted to execute it, you'd first have to read it out of the resource, write it to a file, make the file executable, then execute it.

Also, when you say that you're not getting an error, that probably means that you aren't checking for errors properly.

Intransigent Parsnip
Thank you Rohan. "Not getting an error" was just lazy speak for "it fails silently". I guess I would get an error if I checked properly :)