I found solution also for the problem with executing application form in-app directory!!, Look to text bellow.
Warning: This solution has one big disadvantage ;-(. It’s necessary to execute application only from app-dir. In other cases system doesn’t find required libraries.
The solution could be run patchelf on the client computer with final installation path
Today I start working on deploying my http://www.orm-designer.com/ Qt application on linux platform.
I read a lot of articles about deploying applications but all of the suggested methods was impractical, too complex or unusable. Here is a list of them:
- Using qt.conf in Qt resource or application dir. Usefull for Qt libraries, but not third party libraries
- Installing Qt and third-party libraries in one of the system library path. This method need root permission for app users
- Using startup script for setting correct LD_LIBRARY_PATH. Really? It’s too complicated for maintenance and users
- Using -rpath to specify predetermined path. This method requires the users have this directory and have the full access to this directory
Another solution, the simplest one
I’m not sure why this solution isn’t mentioned in Qt forums or anywhere else. Maybe this solution isn’t so clean and perfect for Linux gurus, but it’s perfect for me.
The solution is in simply changing the search path in already compiled application to “.” (current directory) current application location by using $ORIGIN variable, so application will search all libraries in application directory first. It’s simple, it’s clean. All libraries distributed with application will be isolated in application directory and app-loader will not load any other library by mistake.
Updated: The keyword $ORIGIN do the trick, that you can run application from anywhere on your computer. $ORIGIN is absolute path to your executable.
And how to do this change? As first, you need to download small utility called PatchELF. With this application you can change -rpath in app to anything you need.
patchelf --set-rpath '$ORIGIN' ./ApplicationExecutable
And it is. Now you can copy all required libraries to directory with your application and everything will works correctly.
Installation
Download Ubuntu 32/64bit package from site http://hydra.nixos.org/release/patchelf/patchelf-0.6
Note
Maybe there is a way how to set rpath directly in the linking proces by using -rpath linker param. But I didn’t manage it to work.
If you want to display list of shared libraries used by your application, use this command:
ldd ./ApplicationExecutable