How to work with different libraries in one project?
Hi,
I tried to work with two different libraries on the same project but something went wrong. Basically I'd like to know how to organize a project in C++, how to prevent collision between libraries and so.
What I wanted to do is control a graphic element (SDL library) with my iPhone (through OSC). Just use the accxyz values (accelerometer) to move an image on the screen.
For the OSC part I'm using the liblo library and it works just fine from console. The problem is when I put the code inside the SDL code.
It works for about 30 seconds and then crashes with "segmentation fault". Is it related to the fact that both libraries using threads and they collide each other?
The code for the OSC stuff based on this one:
http://liblo.sourceforge.net/examples/example_server.c
The code combined with SDL is:
Code:
#ifdef __cplusplus
#include <cstdlib>
#else
#include <stdlib.h>
#endif
#ifdef __APPLE__
#include <SDL/SDL.h>
#else
#include <SDL.h>
#endif
#include "lo/lo.h"
int img_x, img_y;
void error(int num, const char *m, const char *path);
int generic_handler(const char *path, const char *types, lo_arg **argv, int argc, void *data, void *user_data);
int main ( int argc, char** argv )
{
// liblo - OSC library
lo_server_thread st = lo_server_thread_new("8000", error);
lo_server_thread_add_method(st, NULL, NULL, generic_handler, NULL);
lo_server_thread_start(st);
// initialize SDL video
if ( SDL_Init( SDL_INIT_VIDEO ) < 0 )
{
printf( "Unable to init SDL: %s\n", SDL_GetError() );
return 1;
}
// make sure SDL cleans up before exit
atexit(SDL_Quit);
// create a new window
SDL_Surface* screen = SDL_SetVideoMode(640, 480, 16,
SDL_HWSURFACE|SDL_DOUBLEBUF);
if ( !screen )
{
printf("Unable to set 640x480 video: %s\n", SDL_GetError());
return 1;
}
// load an image
SDL_Surface* bmp = SDL_LoadBMP("cb.bmp");
if (!bmp)
{
printf("Unable to load bitmap: %s\n", SDL_GetError());
return 1;
}
// centre the bitmap on screen
SDL_Rect dstrect;
img_x = (screen->w - bmp->w) / 2;
img_y = (screen->h - bmp->h) / 2;
dstrect.x = img_x;
dstrect.y = img_y;
// program main loop
bool done = false;
while (!done)
{
// message processing loop
SDL_Event event;
while (SDL_PollEvent(&event))
{
// check for messages
switch (event.type)
{
// exit if the window is closed
case SDL_QUIT:
done = true;
break;
// check for keypresses
case SDL_KEYDOWN:
{
// exit if ESCAPE is pressed
if (event.key.keysym.sym == SDLK_ESCAPE){
done = true;
break;
}
if (event.key.keysym.sym == SDLK_RIGHT){
if(img_x<640-bmp->w){
img_x += 10;
}
break;
}
if (event.key.keysym.sym == SDLK_LEFT){
img_x -= 10;
break;
}
}
} // end switch
} // end of message processing
// DRAWING STARTS HERE
// clear screen
SDL_FillRect(screen, 0, SDL_MapRGB(screen->format, 255, 255, 255));
// draw bitmap
dstrect.x = img_x;
dstrect.y = img_y;
SDL_BlitSurface(bmp, 0, screen, &dstrect);
// DRAWING ENDS HERE
// finally, update the screen :)
SDL_Flip(screen);
} // end main loop
// free loaded bitmap
SDL_FreeSurface(bmp);
// all is well ;)
printf("Exited cleanly\n");
return 0;
}
void error(int num, const char *msg, const char *path)
{
printf("liblo server error %d in path %s: %s\n", num, path, msg);
}
int generic_handler(const char *path, const char *types, lo_arg **argv, int argc, void *data, void *user_data)
{
int accval_x = argv[0]->f*10;
int accval_y = argv[1]->f*10;
if(strcmp(path, "/accxyz")==0){
img_x += accval_x;
img_y -= accval_y;
}
return 1;
}
Thanks