You should check if the shader compiled with glGetShader(shader_id, GL_COMPILE_STATUS, &status), and the errors/warnings of the compiles with glGetShaderInfoLog(). You can check the link status with glGetProgram(program_id, GL_LINK_STATUS, &status), and the link errors/warnings with glGetProgramInfoLog().

The reason it's not working is that you've spelled fcolor two different ways in the fragment shader.

More significantly, you need some newline characters. When C concatenates adjacent string literals, it doesn't insert newlines (or any other whitespace).

At a minimum, the #version directive needs to be terminated with a newline. At the moment, the "core" at the end of the first line and the "layout" at the beginning of the second line will be combined into a single "corelayout" token.

I don't think that you need any other newlines in this particular case, but more complex shaders will have problems (e.g. a "//" comment will extend to the end of the shader, not the end of a single string literal).