Reputation: 4506
I'm zipping a pre-built (no source/object files) binary application for distribution. The binary application requires a couple of libraries not included by default. The only way I seem to be able to get the application to start on the end-user is by including a run.sh
that sets the library path to the current directory:
export LD_LIBRARY_PATH=./:$LD_LIBRARY_PATH
./MyApp.out
However, I'd really like to allow the user to just unzip the zip and doubleclick MyApp.out
(without the shell script). Can I edit MyApp.out
to search the current directory for the library? I've done something similar on OSX using install_name_tool
, but that tool isn't available here.
Upvotes: 2
Views: 1250
Reputation: 1
You want to set the rpath. See this answer. So link using
gcc yourobjects*.o -L/some/lib/dir/ -lsome -Wl,-rpath,.
But you might want even to use -Wl,-rpath,$PWD
or perhaps -Wl,-rpath,'$ORIGIN'
. See this.
You could also (and this should work for a pre-built executable) configure your /etc/ld.so.conf
by adding a line there with an absolute path (of the directory containing the lib), then running ldconfig -v
... See ldconfig(8)
I would suggest adding /usr/local/lib
into /etc/ld.so.conf
and making a symlink from /usr/local/lib/libfoo.so
to e.g. $HOME/libfoo.so
etc... (then run ldconfig
...). I don't think adding a user specific directory to /etc/ld.so.conf
is reasonable ...
PS. What you really want is to package your application (e.g. as a *.deb
package for Debian or Ubuntu, or an *.rpm
for Fedora or Redhat). Package management systems handle dependencies!
Upvotes: 4