title: Vertex shader error C5145: must write to gl_Position using QShaderProgram
body: <p>I am translating a Visual Studio C++ <code>OpenGL</code> project to a Qt project to implement a <code>UI</code>. </p>
  
  <p>I have all the code translated and I am using Qt classes to implement <code>OpenGL</code> part.</p>
  
  <p>The problem I am having now is that when I link the <code>shaderProgram</code> it throws me an error that says: </p>
  
  <blockquote>
    <p>Vertex info (0) : error C5145: must write to gl_Position</p>
  </blockquote>
  
  <p>I am implementing <code>QOpenGLFunctions_4_1_Core</code> and I debug the compile function to see if the code was well read and yes</p>
  
  <p>All the code is read and the compile function returns a true (well compiled).</p>
  
  <pre class="lang-py prettyprint-override"><code>GLuint shaderProgram::createShaderProgram(const char *fileName) {
      // Creamos el shader program y almacenamos su identificador
      if (handler) {
          shaderP = new QOpenGLShaderProgram();
          handler = shaderP-&gt;create();
          if (!handler) {
              fprintf(stderr, "Cannot create shader program: %s.\n", fileName);
              return 0;
          }
      }
      // Cargamos y compilamos cada uno de los shader objects que componen este
      // shader program
      char fileNameComplete[256];
      strcpy_s(fileNameComplete, fileName);
      strcat_s(fileNameComplete, "-vert.glsl");
      QOpenGLShader* vertex = new QOpenGLShader(QOpenGLShader::Vertex);
      GLuint vertexShaderObject = compileShader(fileNameComplete, QOpenGLShader::Vertex,vertex);
      if (vertexShaderObject == 0) {
          return 0;
      }
      strcpy_s(fileNameComplete, fileName);
      strcat_s(fileNameComplete, "-frag.glsl");
      QOpenGLShader* fragment = new QOpenGLShader(QOpenGLShader::Fragment);
      GLuint fragmentShaderObject = compileShader(fileNameComplete, QOpenGLShader::Fragment, fragment);
      if (fragmentShaderObject == 0) {
          return 0;
      }
      // Asociamos los shader objects compilados sin errores al shader program
      shaderP-&gt;addShader(vertex);
      shaderP-&gt;addShader(fragment);
  
      // Enlazamos el shader program y comprobamos si hay errores
      handler = shaderP-&gt;link(); //Here is where the error is thrown
      if(!handler)
      {
          QString error = shaderP-&gt;log();
          std::cout&lt;&lt; error.toStdString()&lt;&lt;std::endl;
          return 0;
      }
      else {
          linked = true;
      }
      return handler;
  }
  
  bool shaderProgram::compileShader(const char *filename, QOpenGLShader::ShaderTypeBit type,QOpenGLShader* shaderComp) {
      // Comprobamos si en la solución existe algún archivo de recursos con el
      // nombre que se pasa como argumento
      if (!fileExists(filename)) {
          fprintf(stderr, "Shader source file %s not found.\n", filename);
          return 0;
      }
      // Si existe se lee en una cadena de caracteres que contiene el listado
      // completo del shader source
      std::ifstream shaderSourceFile;
      shaderSourceFile.open(filename);
      if (!shaderSourceFile) {
          fprintf(stderr, "Cannot open shader source file.\n");
          return 0;
      }
      std::stringstream shaderSourceStream;
      shaderSourceStream &lt;&lt; shaderSourceFile.rdbuf();
      std::string shaderSourceString = shaderSourceStream.str();
      shaderSourceFile.close();
  
      // - Creamos un shader object para ese archivo que se ha leído
      QOpenGLShader shader(type);
  
      QString code(QString::fromStdString(shaderSourceString));
  
      bool result = shader.compileSourceCode(code);
  
      if(!result){
          const QString qs = shader.log();
          std::cout &lt;&lt; qs.toStdString();
          this-&gt;logString = qs.toStdString();
          return false;
      }
      //si ha compilado bien, creamos el shader
      shaderComp = &amp;shader;
      return true;
  }
  
  </code></pre>
  
  <p>I expect the shader program link well and I would be able to draw my objects on screen.</p>