Очевидно - запускать отдельным процессом компилятор с соответствующими параметрами, анализировать ошибки функции старта процесса, ждать завершения процесса компиляции и анализировать код возврата. Так же можно (нужно) перехватывать stdout и stderr и анализировать сообщения компилятора (или просто выводить пользователю).