diff --git a/src/plugins/projectexplorer/gccparser.cpp b/src/plugins/projectexplorer/gccparser.cpp
index 949e9b042b6680695d404a717410a2a78f5b8d5e..76584bc9dcf686cd38f0594a8c2d266b84313c9b 100644
--- a/src/plugins/projectexplorer/gccparser.cpp
+++ b/src/plugins/projectexplorer/gccparser.cpp
@@ -33,42 +33,56 @@
 
 using namespace ProjectExplorer;
 
+namespace {
+    const char * const FILE_PATTERN("^(([a-zA-Z]:)?[^:]*\\.[^:]+):");
+}
+
 GccParser::GccParser()
 {
-    m_regExp.setPattern("^([^\\(\\)]+[^\\d]):(\\d+):(\\d+:)*(\\s(warning|error):)?\\s(.+)$");
+    // e.g.
+    //
+    m_regExp.setPattern(QString::fromLatin1(FILE_PATTERN) + "(\\d+):(\\d+:)*(\\s#?(warning|error):?)?\\s(.+)$");
     m_regExp.setMinimal(true);
 
     m_regExpIncluded.setPattern("^.*from\\s([^:]+):(\\d+)(,|:)$");
     m_regExpIncluded.setMinimal(true);
 
-    m_regExpLinker.setPattern("^(\\S*)\\(\\S+\\):\\s(.+)$");
+    // e.g.:
+    // c:\Qt\4.6\lib/QtGuid4.dll: file not recognized: File format not recognized
+    m_regExpLinker.setPattern(QString::fromLatin1(FILE_PATTERN) + "((\\d+|[^:]*):)?\\s(.+)$");
     m_regExpLinker.setMinimal(true);
 }
 
 void GccParser::stdError(const QString &line)
 {
     QString lne = line.trimmed();
-    if (m_regExpLinker.indexIn(lne) > -1) {
-        QString description = m_regExpLinker.cap(2);
-        emit addTask(TaskWindow::Task(TaskWindow::Error,
-                                      description,
-                                      m_regExpLinker.cap(1) /* filename */,
-                                      -1 /* linenumber */,
-                                      Constants::TASK_CATEGORY_COMPILE));
-        return;
-    } else if (m_regExp.indexIn(lne) > -1) {
+    if (m_regExp.indexIn(lne) > -1) {
         TaskWindow::Task task(TaskWindow::Unknown,
-                              m_regExp.cap(6) /* description */,
+                              m_regExp.cap(7) /* description */,
                               m_regExp.cap(1) /* filename */,
-                              m_regExp.cap(2).toInt() /* line number */,
+                              m_regExp.cap(3).toInt() /* line number */,
                               Constants::TASK_CATEGORY_COMPILE);
-        if (m_regExp.cap(5) == "warning")
+        if (m_regExp.cap(5) == QLatin1String("warning"))
             task.type = TaskWindow::Warning;
-        else if (m_regExp.cap(5) == "error")
+        else if (m_regExp.cap(5) == QLatin1String("error"))
+            task.type = TaskWindow::Error;
+        else if (task.description.startsWith(QLatin1String("undefined reference to")))
             task.type = TaskWindow::Error;
 
         emit addTask(task);
         return;
+    } else if (m_regExpLinker.indexIn(lne) > -1) {
+        bool ok;
+        int lineno = m_regExpLinker.cap(4).toInt(&ok);
+        if (!ok)
+            lineno = -1;
+        QString description = m_regExpLinker.cap(5);
+        emit addTask(TaskWindow::Task(TaskWindow::Error,
+                                      description,
+                                      m_regExpLinker.cap(1) /* filename */,
+                                      lineno,
+                                      Constants::TASK_CATEGORY_COMPILE));
+        return;
     } else if (m_regExpIncluded.indexIn(lne) > -1) {
         emit addTask(TaskWindow::Task(TaskWindow::Unknown,
                                       lne /* description */,