When I re-booted my blogging habits with very UN-sexy and technical topic ‘GNU C Compiler and how to make it with openSUSE’. I thought nobody bothers to read these because A) Everyone who reads openSUSE blogs are PRO B) everyone wants to do Javascript, Python or ‘Put your script language here not C. I can tell actually C ain’t that bad you just have to shoot yourself to leg and then learn how to walk again.
Last blog entry was about ‘openSUSE and GCC part 3: RPM devel packages‘ someone (thanks for pointing that out really!) noted that I should fix C-Code example I was stunned! There were someone that really readied blog entry. Okay he/she didn’t say did he/she like it but some one read it.
I have one real reason to this blog-stuff. I hope I have found something like this when I young and I was starting my journey in Linux land. Currently there is so many more people now in populating it and it’s coming up fast. So If you find errors or don’t understand something be welcome to ask or want to know about something specific let me know! Now we get on today’s topic that is ‘pkg-config and what one can do with it’.
Pkg-config makes things easy/complicated (choose one)
You can live you whole C developer life with Linux and GCC without ever toughing ‘pkg-config‘. pkg-config is just something that can make you life easier with C. It’s not easy to say in couple of words what it does but closest I can get it provides information how to compile application with specific C-library. In other words if you read blog before there were these bare ‘gcc’ library entries in command-line (-lname stuff).
With more complicated libaries: like GTK+ or SDL you can get yourself wondering what libraries shall I include and what not that I can get my application build. Every self respecting developer wants to keep library dependencies as low as possible. So if you don’t want to wonder anymore you can use ‘pkg-config’.
So what it really does?
Last time I promised SDL_image 1.2 example as it’s little bit more complicated to get build. Actually it’s not that complicated but it’s simple example library and you get nice GUI stuff. First we have to zypper or YaST pkg-config, unzip and SDL_image-devel packages so we can use and link against SDL_image.
zypper install pkg-config SDL_image-devel unzip
after you have managed to install it you can download this blog example application made by Ryan Clark from here: ‘SDL_DisplayBitmap.zip‘. It comes from nice SDL gaming wiki (This tutorial actually) and so if you are interested making games with SDL 1.2 or 2.0 you should pop there. You can download files and unzip it or you can crap same source below and save it as ‘SDL_DisplayBitmap.c’ if you do that remember to have some BMP-image in same directory where you compile named: ‘image.bmp‘. Real nerds goes with unzip. If you do it like me it goes like this.
unzip SDL_DisplayBitmap.zip cd SDL_DisplayBitmap
Or code for copying
// THIS WORK, INCLUDING THE SOURCE CODE, DOCUMENTATION // AND RELATED MEDIA AND DATA, IS PLACED INTO THE PUBLIC DOMAIN. // // THE ORIGINAL AUTHOR IS RYAN CLARK. // // THIS SOFTWARE IS PROVIDED AS-IS WITHOUT WARRANTY // OF ANY KIND, NOT EVEN THE IMPLIED WARRANTY OF // MERCHANTABILITY. THE AUTHOR OF THIS SOFTWARE, // ASSUMES _NO_ RESPONSIBILITY FOR ANY CONSEQUENCE // RESULTING FROM THE USE, MODIFICATION, OR // REDISTRIBUTION OF THIS SOFTWARE. #include <stdlib.h> #include <SDL/SDL.h&lgt; int main(int argc, char *argv[]) { SDL_Surface *screen; //This pointer will reference the backbuffer SDL_Surface *image; //This pointer will reference our bitmap sprite SDL_Surface *temp; //This pointer will temporarily reference our bitmap sprite SDL_Rect src, dest; //These rectangles will describe the source and destination regions of our blit //We must first initialize the SDL video component, and check for success if (SDL_Init(SDL_INIT_VIDEO) != 0) { printf("Unable to initialize SDL: %s\n", SDL_GetError()); return 1; } //When this program exits, SDL_Quit must be called atexit(SDL_Quit); //Set the video mode to fullscreen 640x480 with 16bit colour and double-buffering screen = SDL_SetVideoMode(640, 480, 16, SDL_DOUBLEBUF | SDL_FULLSCREEN); if (screen == NULL) { printf("Unable to set video mode: %s\n", SDL_GetError()); return 1; } //Load the bitmap into a temporary surface, and check for success temp = SDL_LoadBMP("image.bmp"); if (temp == NULL) { printf("Unable to load bitmap: %s\n", SDL_GetError()); return 1; } //Convert the surface to the appropriate display format image = SDL_DisplayFormat(temp); //Release the temporary surface SDL_FreeSurface(temp); //Construct the source rectangle for our blit src.x = 0; src.y = 0; src.w = image->w; //Use image->w to display the entire width of the image src.h = image->h; //Use image->h to display the entire height of the image //Construct the destination rectangle for our blit dest.x = 100; //Display the image at the (X,Y) coordinates (100,100) dest.y = 100; dest.w = image->w; //Ensure the destination is large enough for the image's entire width/height dest.h = image->h; //Blit the image to the backbuffer SDL_BlitSurface(image, &src, screen, &dest); //Flip the backbuffer to the primary SDL_Flip(screen); //Wait for 2500ms (2.5 seconds) so we can see the image SDL_Delay(2500); //Release the surface SDL_FreeSurface(image); //Return success! return 0; }
I chose this one because it doesn’t have any compiling aid for poor fellow in ZIP. So we can compile it in openSUSE and most of Linux distros like this:
gcc -o SDL_Display Bitmap SDL_DisplayBitmap.c $(pkg-config --libs --cflags SDL_image) ./SDL_Display
You should just see nice spaceship for 2.5 seconds nothing more or you own nice BMP-image.
Do I have to be BASH wizard and what even is BASH?
If you are reading this in openSUSE you probably use BASH (Bourne Again Shell) and that is all I want to say about that. It’s not the topic and you can forget all about it. You don’t have to be wizard of BASH to understand what happens in that sentence above. again we are compiling with ‘gcc‘ file named ‘SDL_DisplayBitmap.c‘ to binary ‘SDL_DisplayBitmap‘. New stuff starts after that. It just tells to BASH ask from ‘pkg-config’ libraries and needed c-flags that comes with SDL_image and attach them here. If you just run you get something like this
pkg-config --libs --cflags SDL_image -D_GNU_SOURCE=1 -D_REENTRANT -I/usr/include/SDL -lSDL_image -lSDL -lpthread
So compile string is actual then
gcc -o SDL_Display Bitmap SDL_DisplayBitmap.c -D_GNU_SOURCE=1 -D_REENTRANT -I/usr/include/SDL -lSDL_image -lSDL -lpthread
But in every distro tends to tune these cflags stuff and every release of ‘SDL_image’ can tune needed libraries. This what you don’t want to know anything about! You don’t want to hassle openSUSE’s or Fedora’s or Ubuntu’s global building flags or include neither library locations by hand. You should just go with the automatic ‘pkg-config’ way. If I can give you one bit of advise other than always use suncream for libraries have ‘pkg-config’-config files and use them. Next we get on ‘make’ and Makefiles. As I’m too lazy to copy’n’paste my ‘gcc‘ strings here.
Both comments and pings are currently closed.