Advertisement

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

Started by June 19, 2012 07:03 PM
2 comments, last by Wonder Boy 12 years, 5 months ago
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?
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.
Advertisement
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.
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:

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



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

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

This topic is closed to new replies.

Advertisement