The problem is that roslaunch secretly adds two arguments when starting a node's executable: _name __name and _log. __log. If the node's executable is not ROS interoperable, then the executable may fail because it doesn't know how to handle the _name __name and _log __log arguments that were added on by roslaunch. This is the case here, since roslaunch is calling the "gzclient" script, which executes "gzclient" with arguments passed in by roslaunch. gzclient dies because it doesn't know how to handle the _name __name and _log __log arguments passed in from roslaunch.