Ooof. So that is a much bigger can of worms that you realize. I thought you meant on the same device.
It's not a physics engine problem really, it's a floating point number problem. Basically, you cannot expect any code that uses floating point numbers to give you the same results if you use a different compiler, change compiler settings, compile for a different OS, compile for a different ABI, or compile for a different CPU. Floating point numbers are not exact, so any little change to the code or the order of the machine instructions is going to give you different results. It's even worse with something like a physics library because each frame is based on the calculations of the previous frame. So any little error builds up over time. You aren't going to find that any particular "version" of the simulation is more or less correct, but they will all be slightly different. A different library isn't going to fix that.
You *cannot* rely on a simulation to be repeatable unless run within the same exact executable and with the same exact starting conditions. If you need the simulation to be the same across different devices (such as in a networked game) then you need to make sure that you compensate for that in your code. Usually this is done by making one of the simulations the server and constantly resynchronizing all of the other simulations to it. Only what happens on the server's copy of the simulation matters.
If you *really* want deterministic simulations across devices you can force software (integer) based floating point math, or implement fixed precision math. It's not really worth it though in my opinion (I certainly haven't done it). The resulting code would be much much more work and much much slower than using the (lossy) native floating point hardware and dealing with inaccuracies.