LINUX.ORG.RU

Не компилируется OpenGL прога в CLion

 ,


0

3

Привет всем! Столкнулся с проблемой - никак не удаётся скомпилировать базовый код отображения окна (для OpenGL проги). Ubuntu 17.04 (x64) CLion 2017.1.1

Устанавливал GLFW точно по инструкции: http://www.glfw.org/docs/latest/compile.html#compile_compile

Код программки:

#include <GLFW/glfw3.h>

int main(void)
{
    GLFWwindow* window;

    /* Initialize the library */
    if (!glfwInit())
        return -1;

    /* Create a windowed mode window and its OpenGL context */
    window = glfwCreateWindow(640, 480, "Hello World", NULL, NULL);
    if (!window)
    {
        glfwTerminate();
        return -1;
    }

    /* Make the window's context current */
    glfwMakeContextCurrent(window);

    /* Loop until the user closes the window */
    while (!glfwWindowShouldClose(window))
    {
        /* Render here */
        glClear(GL_COLOR_BUFFER_BIT);

        /* Swap front and back buffers */
        glfwSwapBuffers(window);

        /* Poll for and process events */
        glfwPollEvents();
    }

    glfwTerminate();
    return 0;
}

Содержимое CMakeLists.txt:

cmake_minimum_required(VERSION 3.7)
project(opengl)
set(CMAKE_CXX_STANDARD 11)
set(SOURCE_FILES main.cpp)
add_executable(opengl ${SOURCE_FILES})
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/bin")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++14 -pthread -fpermissive")
find_package (PkgConfig REQUIRED)
find_package (GLUT REQUIRED)
find_package(glfw3 3.2 REQUIRED)
find_package(OpenGL REQUIRED)
include_directories(${OPENGL_INCLUDE_DIR}  ${GLUT_INCLUDE_DIRS} ${glfw3})
file(GLOB SOURCE_FILES
        *.cpp
        *.h
        )
add_executable(main.cpp ${SOURCE_FILES})
target_link_libraries (main.cpp ${OPENGL_LIBRARIES} ${GLUT_LIBRARIES} GL m dl Xinerama Xrandr Xi Xcursor X11 Xxf86vm pthread)

Получаемые ошибки компиляции:

CMakeFiles/opengl.dir/main.cpp.o: In function `main':
/home/efi/w/opengl/main.cpp:8: undefined reference to `glfwInit'
/home/efi/w/opengl/main.cpp:12: undefined reference to `glfwCreateWindow'
/home/efi/w/opengl/main.cpp:15: undefined reference to `glfwTerminate'
/home/efi/w/opengl/main.cpp:20: undefined reference to `glfwMakeContextCurrent'
/home/efi/w/opengl/main.cpp:23: undefined reference to `glfwWindowShouldClose'
/home/efi/w/opengl/main.cpp:26: undefined reference to `glClear'
/home/efi/w/opengl/main.cpp:29: undefined reference to `glfwSwapBuffers'
/home/efi/w/opengl/main.cpp:32: undefined reference to `glfwPollEvents'
/home/efi/w/opengl/main.cpp:35: undefined reference to `glfwTerminate'
collect2: error: ld returned 1 exit status
CMakeFiles/opengl.dir/build.make:94: recipe for target 'opengl' failed
make[3]: *** [opengl] Error 1
CMakeFiles/Makefile2:104: recipe for target 'CMakeFiles/opengl.dir/all' failed
make[2]: *** [CMakeFiles/opengl.dir/all] Error 2
CMakeFiles/Makefile2:116: recipe for target 'CMakeFiles/opengl.dir/rule' failed
make[1]: *** [CMakeFiles/opengl.dir/rule] Error 2
Makefile:131: recipe for target 'opengl' failed
make: *** [opengl] Error 2

Подозрения на ошибки CMakeLists.txt Есть идеи, как с этим бороться?

★★

Мне сложно разобраться в твоем CMakeList.txt.

Я создал контейнер в докере с убунтой 17.04. Затем я поставил пакеты build-essentian и libglfw3-dev (они с собой потянули тонну всего, не разбираясь поставил все что просили). Затем я скопипастил твой исходник в файл main.cpp и собрал по пролетарски (праздники все еще дают знать) командой

g++ main.cpp -lglfw -lGL

Все собралось. Запускается ли, мне не понятно, т.к. гуя у меня под рукой нет. Но собралось без ошибок.

Подобные ошибки, судя по всему, вываливаются на этапе линковки из-за того, что не указаны все необходимые библиотеки.

Попробуй в target_link_libraries добавить glfw или -lglfw. Если не получится, попробуй добавить еще -lGL (я плохо помню синтаксис target_link_libraries).

Хотя по идее, тебе их не надо указывать руками, все эти зависимые либы должны найтись в find_package и занестись в необходимые переменные. Можешь глянуть в какие переменные они заносятся (напр., ты вызываешь find_package(glfw3 3.2 REQUIRED) но в target_link_libraries ничего связанного с glfw нет).

Можешь поискать как сделать более подробный вывод информации при сборке, чтобы ты видел с какими флагами вызываются компиляторы и линковщики. Обычно это делается при помощи «make V=1» или «make VERBOSE=1» или еще как. Погугли.

Deleted
()

Да, CLion тут вообще не причем. Он будет только путать. Пользуйся нормальным cmake и make. Иначе, на первых порах, тебе придется бороться еще и с CLion'ом. Хотя, для совсем первых пор, лучше обойтись и без cmake и make. Научись собирать сначала при помощи gcc, поймешь какие библиотеки тебе нужны, какие ключи нужно указывать компилятору, затем разбирайся уже с cmake. Тогда будет проще. Ты будешь знать, как сгенерированные файлы cmake должны вызывать компилятор и будешь знать, что должно находиться в CMakeList.txt. Ну а CLion понадобится уже позже, когда и проект разрастется и отладка понадобится.

Deleted
()
Ответ на: комментарий от Deleted

Спасибо за совет

Попробую и так тоже

zelo ★★
() автор топика

target_link_libraries (main.cpp ${OPENGL_LIBRARIES} ${GLUT_LIBRARIES} GL m dl Xinerama Xrandr Xi Xcursor X11 Xxf86vm pthread)

И где тут GLFW?

andreyu ★★★★★
()
Ответ на: комментарий от andreyu

Увы, не помогло...

cmake_minimum_required(VERSION 3.7)
project(opengl)
set(CMAKE_CXX_STANDARD 11)
set(SOURCE_FILES main.cpp)
add_executable(opengl ${SOURCE_FILES})
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/bin")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++14 -pthread -fpermissive")
find_package (PkgConfig REQUIRED)
find_package (GLUT REQUIRED)
find_package(glfw3 3.2 REQUIRED)
find_package(OpenGL REQUIRED)
include_directories(${OPENGL_INCLUDE_DIR}  ${GLUT_INCLUDE_DIRS} ${GLFW_LIBRARIES})
file(GLOB SOURCE_FILES
        *.cpp
        *.h
        )
add_executable(main.cpp ${SOURCE_FILES})
target_link_libraries (main.cpp ${OPENGL_LIBRARIES} ${GLUT_LIBRARIES} ${GLFW_LIBRARIES} GL m dl Xinerama Xrandr Xi Xcursor X11 Xxf86vm pthread)
zelo ★★
() автор топика
Ответ на: Увы, не помогло... от zelo

Так выхлоп компилятора где?

Вставьте такую строку и покажите выхлоп:
message(status "GLFW libs ${GLFW_LIBRARIES}")

p.s. Похоже в вашем случае правильно было бы написать ${GLFW3_LIBRARIES}

andreyu ★★★★★
()
Последнее исправление: andreyu (всего исправлений: 1)
Ответ на: комментарий от andreyu
CMakeFiles/opengl.dir/main.cpp.o: In function `main':
/home/efi/w/opengl/main.cpp:7: undefined reference to `glfwInit'
/home/efi/w/opengl/main.cpp:18: undefined reference to `glfwCreateWindow'
/home/efi/w/opengl/main.cpp:21: undefined reference to `glfwTerminate'
/home/efi/w/opengl/main.cpp:24: undefined reference to `glfwMakeContextCurrent'
/home/efi/w/opengl/main.cpp:27: undefined reference to `glewExperimental'
/home/efi/w/opengl/main.cpp:28: undefined reference to `glewInit'
/home/efi/w/opengl/main.cpp:31: undefined reference to `glGetString'
/home/efi/w/opengl/main.cpp:32: undefined reference to `glGetString'
/home/efi/w/opengl/main.cpp:37: undefined reference to `glEnable'
/home/efi/w/opengl/main.cpp:38: undefined reference to `glDepthFunc'
/home/efi/w/opengl/main.cpp:43: undefined reference to `glfwTerminate'
collect2: error: ld returned 1 exit status
CMakeFiles/opengl.dir/build.make:94: recipe for target 'opengl' failed
make[3]: *** [opengl] Error 1
CMakeFiles/Makefile2:104: recipe for target 'CMakeFiles/opengl.dir/all' failed
make[2]: *** [CMakeFiles/opengl.dir/all] Error 2
CMakeFiles/Makefile2:116: recipe for target 'CMakeFiles/opengl.dir/rule' failed
make[1]: *** [CMakeFiles/opengl.dir/rule] Error 2
Makefile:131: recipe for target 'opengl' failed
make: *** [opengl] Error 2
zelo ★★
() автор топика
Ответ на: комментарий от andreyu
/home/efi/.SOTWARE/clion-2017.1.1/bin/cmake/bin/cmake -DCMAKE_BUILD_TYPE=Debug -G "CodeBlocks - Unix Makefiles" /home/efi/w/opengl
status«GLFWlibs»
-- Configuring done
-- Generating done
-- Build files have been written to: /home/efi/w/opengl/cmake-build-debug
zelo ★★
() автор топика
include_directories(/usr/include/GLFW)
target_link_libraries(${PROJECT_NAME} glfw ${GLFW_LIBRARIES})
anonymous
()

У меня такое ощущение, что CMakeLists.txt написан путем дерганья рандомных строк с stackoverflow в надежде, что звезды сложатся и оно само заработает (переменная CMAKE_CXX_STANDARD устанавливается в 11, но потом устанавливается в cxx флаги добавляется -std=c++14, ищется пакет PkgConfig, но нигде не используется, тоже самое и с GLUT, в target_link_libraries дописывается целая портянка левых либ, которые, судя по исходникам, нигде не нужны и т.д.)

Минимально адекватный CMakeLists.txt для этого примера

cmake_minimum_required(VERSION 3.7)
project(opengl)

# С++14 тут не используется, но мало ли, на будующее
set(CMAKE_CXX_STANDARD 14)

set(SOURCE_FILES main.cpp)
add_executable(opengl ${SOURCE_FILES})

find_package(OpenGL REQUIRED)

# по факту, ничего полезного не делает. Судя по всему, определяет, что в системе есть
# библиотека glfw3 и она соответсвует требуемой версии. Переменные _INCLUDE_DIR и
# _LIBRARIES не заполняет. У них на багтрекере по этому поводу куча вопросов, но
# чем все кончилось - не понятно. В target_link_libraries нужно руками добавить glfw
find_package(glfw3 3.2 REQUIRED)

target_include_directories(opengl PRIVATE ${OPENGL_INCLUDE_DIR})
target_link_libraries(opengl ${OPENGL_LIBRARIES} glfw)
Deleted
()
Ответ на: комментарий от andreyu

Я окончательно запутался

Если это не наглость, я бы хотел попросить минимальный код для двух файлов - Cmake и main.cpp, которые просто нарисуют треугольник, прямую, точку. Мне важно начать, и перейти непосредственно к созданию изображений, все тонкости - потом. Буду очень признателен

zelo ★★
() автор топика
Ответ на: комментарий от andreyu

Вроде скомпилировалось, и запустилось

Но картинки нет

#include <GLFW/glfw3.h>

int main(void)
{
    GLFWwindow* window;

    /* Initialize the library */
    if (!glfwInit())
        return -1;

    /* Create a windowed mode window and its OpenGL context */
    window = glfwCreateWindow(640, 480, "Hello World", NULL, NULL);
    if (!window)
    {
        glfwTerminate();
        return -1;
    }

    /* Make the window's context current */
    glfwMakeContextCurrent(window);

    /* Loop until the user closes the window */
    while (!glfwWindowShouldClose(window))
    {
        /* Render here */

        GLfloat vertices[] = {
                -0.5f, -0.5f, 0.0f,
                0.5f, -0.5f, 0.0f,
                0.0f,  0.5f, 0.0f
        };
        glDrawArrays(GL_TRIANGLES, 0, 3);
        glClear(GL_COLOR_BUFFER_BIT);

        /* Swap front and back buffers */
        glfwSwapBuffers(window);

        /* Poll for and process events */
        glfwPollEvents();
    }

    glfwTerminate();
    return 0;
}

zelo ★★
() автор топика
Последнее исправление: zelo (всего исправлений: 1)
Ответ на: комментарий от zelo

Задать вершины треугольника и отрисовать их?

Ну задали вы вершины, а кто об этом, кроме вас, знает? OpenGL не умеет читать ваши мысли.

andreyu ★★★★★
()
Ответ на: комментарий от andreyu

Вот, читаю маны по CMake, а то снова что-то не линкуется...

Затем перейду к предложенному Вами линку - надеюсь, что освою быстро. Спасибо, andreyu!

zelo ★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.