Cahill (13-12) tossed his third career complete game, yielding two runs while walking three and striking out nine.
The right-hander drove in a run with a bases-loaded walk in the fifth inning and added an RBI single in the seventh for the D-backs.
Justin Germano (2-10) was roughed up for seven runs on 10 hits in just 4 1/3 innings for the Cubs.
Alfonso Soriano smacked a two-run homer for Chicago.
Megyn Kelly: Santa Claus and Jesus are both white men
Wisconsin business offering 'therapeutic cuddling' forced to close