I made this a while ago to be an all-around, header-only solution for GPIO on the Pi. No libraries to install or anything like that. I use this in every project that needs GPIO. Even though this is C++ (11), it does have a useful implementation of the polling method. You can't specify a callback function though, the way it works is it simply doesn't return until it detects an interruption (so you might have to run this on multiple threads to handle multiple buttons). It doesn't deal with debouncing though, but that's not that hard to do (just simply check the value again after a couple of milliseconds). Here it is:
https://github.com/adam10603/raspberryPi_GPIO
Here's a quick sketch on how to use it:
auto myButton = GPIO::openGPIO(3, GPIO_INPUT);
while (true) {
myButton->waitForEdge(GPIO_EDGE_RISING);
cout << "Button pressed!" << endl;
}
This would print out "Button pressed!" every time you push the button. It's very simple, this is all the code you need for it (other than including the header file of course).