Jump to content

  • Log In with Google      Sign In   
  • Create Account


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


Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.

  • You cannot reply to this topic
3 replies to this topic

#1 Wonder Boy   Members   -  Reputation: 110

Like
0Likes
Like

Posted 19 June 2012 - 01:03 PM

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?

Sponsor:

#2 abcdef44   Banned   -  Reputation: 2

Like
0Likes
Like

Posted 21 June 2012 - 02:14 AM

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.

#3 Wonder Boy   Members   -  Reputation: 110

Like
0Likes
Like

Posted 21 June 2012 - 07:34 AM

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, 21 June 2012 - 10:22 AM.


#4 Wonder Boy   Members   -  Reputation: 110

Like
1Likes
Like

Posted 21 June 2012 - 07:29 PM

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




Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.



PARTNERS