Hola,
De la hoja del manual de setcookie()
Cita: If output exists prior to calling this function, setcookie() will fail and return FALSE
Es decir, como con header(), no puedes enviar nada al navegador antes del setcookie(). Ni HTML, ni echos, ni espacios, nada de nada.
Por cierto, ¿que valor tienen las directivas error_reporting y display_errors? Porque este error de enviar salida antes de header() o setcookie() genera un mensaje de error. Y durante el desarrollo es importante poder leer todos los mensajes de error (tambien los notice).
Saludos.