I'm not sure there is a way to guarantee a global optimum. If you are willing to settle for a local optimum, you could try a penalty method.
For instance, you could square the difference between left and right side of each constraint, sum the squared differences, multiply by a positive parameter value (which I will call the penalty weight) and add that to the original objective function. That gives you an unconstrained problem, on which you could try something like gradient descent. If the solution to which it converged violated any constraints by more than an acceptable amount of rounding error, you would increase the penalty weight and try again, until you got a solution that was close enough to satisfying all constraints.