2014-11-13 2 views
-1

Я изучаю OpenGL и использую SDL2. Проблема, с которой я сталкиваюсь, заключается в том, что код, который я пишу, не компилируется в C++, но тот же код, похоже, компилируется в C. Я создал небольшую выдержку из программы here.Программа OpenGL компилируется с C, но не с C++

Когда я скомпилировать этот код с помощью GCC компилирует и запускает штраф

$ gcc -o testgl testgl.c `pkg-config --cflags --libs sdl2 gl` 
$ ./test 
OpenGL version : 4.4.0 NVIDIA 340.58 

Но когда я компилирую тот же код, используя г ++

$ g++ -o testgl testgl.c `pkg-config --cflags --libs sdl2 gl` 
test.c: In function ‘int main()’: 
test.c:14:27: error: ‘glGenVertexArrays’ was not declared in this scope 
    glGenVertexArrays(1, &vao); 
         ^
test.c:15:23: error: ‘glBindVertexArray’ was not declared in this scope 
    glBindVertexArray(vao); 
        ^

Хотя это не совсем проблема в говорят, как Я могу просто использовать C вместо C++, но я хочу знать, почему это происходит, и есть ли способ исправить это?

Окружающая среда: Ubuntu 14,04, GCC 4.8, SDL 2

+0

gcc не является компилятором C. это многоязычная утилита компиляции, которая будет вызывать g ++ для расширений .cpp. Итак, в вашем случае, я думаю, проблема может быть проблемой заголовка? gcc может вызывать g ++ с разными флагами, чем ваши – galinette

+0

Я ошибаюсь в своем предыдущем комментарии. Даже если gcc вызывает g ++ для файлов c и C++, для файла .c gcc вызовет g ++ с флагом C, тогда как ваша командная строка для g ++ будет компилироваться с использованием стандарта C++. – galinette

ответ

2

Вполне возможно, что это происходит потому, что C не требует прототипы функций, в то время как C++ делает.

Компиляция в C, вы в конечном итоге ссылаетесь на определения в libGL, и это работает. Вам не нужны технические данные для этих функций. Компилируя в C++, вам не хватает заголовков, которые предоставляют прототипы функций. Вы можете использовать GLEW для этого, или вы можете загружать функции GL самостоятельно с помощью специфичных для ОС API (например, wgl, glx).

Смежные вопросы