Sign in to follow this  
Wonder Boy

[SOLVED] My game doesn't detect libpng in its directory (game packaging)

Recommended Posts

Wonder Boy    110
Hello GameDev:)
I've finished my first simple game (Tictactoe) and I'm trying to make ready-to-run packages with all libs included, for Linux and Windows. I succeeded in compiling for both systems and making Windows package, however I have problem with 32-bit linux version (as in the tittle): compiled game doesn't detect libpng in its directory. Or maybe other libs too, but it's the only lib I have to copy to /usr/lib32/.

Some details:
My system: Debian Sid 64-bit
SDL libs: 32-bit, all latest possible (1.2.15)
GCC: 4.7
libpng: 1.2.49-1

So I'm building a 32-bit binary on a 64-bit linux system:

g++ *.cpp -I/my_include_dir/ -L/my_lib_dir/ -lSDL_image -lSDL_ttf -lSDL_mixer -lSDL -lpthread -ldl -lfreetype -lz -o build/tictactoe32 -m32

No compile errors. Apparently libpng is not needed during compilation.

However my game doesn't load images:
Error: Failed loading libpng.so.3: libpng.so.3: cannot open shared object file: No such file or directory

So I downloaded 32-bit version of libpng from Debian's site, libpng12.so.0.49.0, created a link to it with a name libpng.so.3 and copied both files to my game's dir and it didn't help.

I have to copy libpng.so.3 and libpng12.so.0.49.0 to /usr/lib32/. As I said, libpng.so.3 is only a link to a newer version, which in Debian is libpng12.so.0.49.0. And then it works. But when I move both files to my game's dir, it can't detect it.
How can I solve it?

Share this post


Link to post
Share on other sites
mike4    2
as you use sdl_image don't use also libpng. They might conflict, only use sdl_image which has all needed functions and is more simple to use.

Share this post


Link to post
Share on other sites
Wonder Boy    110
Hi, thanks for the answer.
I don't use libpng directly in my code, it is loaded by SDL_image at runtime, when needed to load different kinds of images (png in this case). I use only SDL_image. Edited by Wonder Boy

Share this post


Link to post
Share on other sites
Wonder Boy    110
Solution:
I have to include '-rpath' flag with a specified directory in the command above so the directory will be searched at the runtime.

For example:
search the same dir as executable dir: -Wl,-rpath,.
search "libs" directory inside directory where is located executable: -Wl,-rpath,libs/

So now my command looks like this:
[code]
g++ *.cpp -I/my_include_dir/ -L/my_lib_dir/ -lSDL_image -lSDL_ttf -lSDL_mixer -lSDL -lpthread -ldl -lfreetype -lz -Wl,-rpath,. -o build/tictactoe32 -m32

[/code]

Useful commands:
Check which libraries will be loaded by the executable at runtime:
[code]ldd <binary>[/code]
Check which directories will be searched for libraries:
[code]readelf -d <binary> | grep RPATH[/code]

Sources:
[url="http://tldp.org/HOWTO/Program-Library-HOWTO/shared-libraries.html"]http://tldp.org/HOWTO/Program-Library-HOWTO/shared-libraries.html[/url]
[url="http://www.eyrie.org/%7Eeagle/notes/rpath.html"]http://www.eyrie.org/~eagle/notes/rpath.html[/url]
[url="http://www.techytalk.info/c-cplusplus-library-programming-on-linux-part-one-static-libraries/"]http://www.techytalk.info/c-cplusplus-library-programming-on-linux-part-one-static-libraries/[/url] (3 parts)
in terminal: man ld

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

Sign in to follow this