개발 · 컴퓨터공학 / / 2024. 10. 9. 11:37

Qt6 Opengl 시작하기 시행착오

728x90
반응형

 

qt opengl 추가하기

opengl을 Qt에서 사용하려면 qt 전용으로 wrapping된 opengl을 사용해야한다.

그러기 위해서 cmake로 빌드할 수 있는 프로젝트에서는 CMake 파일을 수정해야한다.

 

target_link_libraries(appuntitled
    PRIVATE Qt6::Quick
    PRIVATE Qt6::OpenGL
)

library에 Opengl을 추가한다. 

 

cmake 빌드에서 QT 결로를 못찾아 말썽인데.

D 드라이브에 Qt를 설치해놓았었다.

윈도우에서 default 경로는 C 드라이브이므로 C드라이브로 옮겨 주었다. 

 

흠...

cmake가 말썽이다.

 

https://medium.com/@dgodfrey206/using-opengl-with-qt-creator-73bca9b8cccb

 

Using OpenGL with QT Creator

WARNING: To understand this article, it is necessary to have previous knowledge of C, C++, QT, QT Creator, OpenGL, 3D Graphics, Object…

medium.com

요 포스팅을 따라 해보자.

Qt Creator를 키고,

Qt Widgets로 프로젝트 만들기

build system은 cmake로 골라주자

 

프로젝트 생성 후 F5를 누르면 실행 가능하다. 

 

위 두 줄을 cmakelist에 넣기.

 

클래스 하나 추가

 

find_package(Qt6 REQUIRED COMPONENTS OpenGL)
target_link_libraries(untitled PRIVATE Qt6::OpenGL)

opengl 사용을 위해 cmake에 추가

 

cmake_minimum_required(VERSION 3.16)

project(untitled VERSION 0.1 LANGUAGES CXX)

set(CMAKE_AUTOUIC ON)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

find_package(QT NAMES Qt6 Qt5 REQUIRED COMPONENTS Widgets LinguistTools)
find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS Widgets LinguistTools)
find_package(Qt6 REQUIRED COMPONENTS OpenGL)

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

set(TS_FILES untitled_ko_KR.ts)

set(PROJECT_SOURCES
        main.cpp
        mainwindow.cpp
        mainwindow.h
        mainwindow.ui
        ${TS_FILES}
)

if(${QT_VERSION_MAJOR} GREATER_EQUAL 6)
    qt_add_executable(untitled
        MANUAL_FINALIZATION
        ${PROJECT_SOURCES}
        glwidget.h glwidget.cpp
    )
# Define target properties for Android with Qt 6 as:
#    set_property(TARGET untitled APPEND PROPERTY QT_ANDROID_PACKAGE_SOURCE_DIR
#                 ${CMAKE_CURRENT_SOURCE_DIR}/android)
# For more information, see https://doc.qt.io/qt-6/qt-add-executable.html#target-creation

    qt_create_translation(QM_FILES ${CMAKE_SOURCE_DIR} ${TS_FILES})
else()
    if(ANDROID)
        add_library(untitled SHARED
            ${PROJECT_SOURCES}
        )
# Define properties for Android with Qt 5 after find_package() calls as:
#    set(ANDROID_PACKAGE_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/android")
    else()
        add_executable(untitled
            ${PROJECT_SOURCES}
        )
    endif()

    qt5_create_translation(QM_FILES ${CMAKE_SOURCE_DIR} ${TS_FILES})
endif()

target_link_libraries(untitled PRIVATE Qt${QT_VERSION_MAJOR}::Widgets)
target_link_libraries(untitled PRIVATE Qt6::OpenGL)

# Qt for iOS sets MACOSX_BUNDLE_GUI_IDENTIFIER automatically since Qt 6.1.
# If you are developing for iOS or macOS you should consider setting an
# explicit, fixed bundle identifier manually though.
if(${QT_VERSION} VERSION_LESS 6.1.0)
  set(BUNDLE_ID_OPTION MACOSX_BUNDLE_GUI_IDENTIFIER com.example.untitled)
endif()
set_target_properties(untitled PROPERTIES
    ${BUNDLE_ID_OPTION}
    MACOSX_BUNDLE_BUNDLE_VERSION ${PROJECT_VERSION}
    MACOSX_BUNDLE_SHORT_VERSION_STRING ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}
    MACOSX_BUNDLE TRUE
    WIN32_EXECUTABLE TRUE
)

include(GNUInstallDirs)
install(TARGETS untitled
    BUNDLE DESTINATION .
    LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
    RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
)

if(QT_VERSION_MAJOR EQUAL 6)
    qt_finalize_executable(untitled)
endif()

수정한 cmake

cmake는 여전히.. 먹통이다.

 

cmake가 권장된다지만, 일단 실행 방법을 찾아 qmake로 실행해보자.

qmake

qmake로 빌드 시스템을 맞추어 생성해준다.

 

https://medium.com/@dgodfrey206/using-opengl-with-qt-creator-73bca9b8cccb

qmake의 opengl 세팅 방법을 시도해본다. 

 

QT       += core gui opengl

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

CONFIG += c++17

# You can make your code fail to compile if it uses deprecated APIs.
# In order to do so, uncomment the following line.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0

SOURCES += \
    glwidget.cpp \
    main.cpp \
    mainwindow.cpp

HEADERS += \
    glwidget.h \
    mainwindow.h

FORMS += \
    mainwindow.ui
LIBS += opengl32.lib

TRANSLATIONS += \
    untitled2_ko_KR.ts
CONFIG += lrelease
CONFIG += embed_translations

# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target

고쳐주고

실행하면

 

음..

 

qt 환경변수 설정

제어판 > 시스템 > 고급 시스템 설정 > 환경 변수에서 Path에 추가한다. 

그래도 명령어가 안되네.. 재부팅을 해야하나 싶다.

 

Qt 설치할때 컴파일러 전용 command line이 있다고 한다. 

아무리 찾아봐도 못찾겠다.

qt creator build

찾다보니 qt creator에서 프로젝트 build를 하는 방법으로 qmake 내용을 반영할 수 있는 것 같다.

 

QT       += core gui opengl

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

CONFIG += c++17

# You can make your code fail to compile if it uses deprecated APIs.
# In order to do so, uncomment the following line.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0

SOURCES += \
    main.cpp \
    mainwindow.cpp

HEADERS += \
    mainwindow.h

FORMS += \
    mainwindow.ui

LIBS += -lopengl32 -lglu32

# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target

이렇게 LIBS에 -lopengl32 -lglu32를 추가해서 

build를 했더니 에러 없이 잘 된다. 

 

하지만 결국 QOpenGLWidget 헤더를 추가하니 not found가 뜨는것은 마찬가지..

다른 방법을 찾아보자.

 

https://www.youtube.com/watch?v=XiMplRfuFJc

위 영상을 해보자.

 

CMake QTDIR 환경변수 설정 

이제보니 환경변수를 CMAKE에서는 이렇게 설정해준다.

그리고 환경변수로 아까는 계정 내 변수를 바꿨는데 시스템 변수를 바꾸어야했다.

QTDIR 두 개를 추가

CMAKE를 할 때 자꾸 QTDIR 에러가 나는게 이거였던 것 같다.

 

cmake를 다시 해보면 configure이 잘 되었다.

그럼 generate를 해볼까

generate도 잘 되었다.

만들어진 build 폴더를 열어보니 솔루션이 잘 생성되어있다!

해당 프로젝트를 열어서 빌드를 해봤지만, 여전히 QGLWidget은 찾지 못한다.

 

find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS OpenGLWidgets)
target_link_libraries(untitled PRIVATE Qt::OpenGLWidgets)

이렇게 OpenGLWidgets를 cmake에 추가해서 빌드해보았다. 

 

그래도 여전히 안되네.

 

find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS OpenGLWidgets)
target_link_libraries(untitled PRIVATE Qt${QT_VERSION_MAJOR}::OpenGLWidgets)

다시 버전도 넣고

cmake 빌드

 

Qt 포럼 글 

 

https://forum.qt.io/topic/137709/qopenglwidget-not-found-in-qt-version-6-3-0/8

 

QOpenGLWidget not found in Qt version 6.3.0

@makopo check the definitions of these functions in QOpenGLWidget.h to see if they have = 0 at the end; if yes, you have to do it.

forum.qt.io

여기도 나와 같이 QOpenGLWidget이 안되서 고생하는 Qt forum글이 있다.

 

이런 opengl 헤더들은 잘만 인식 되는데.. 

이걸로는 구현하지 못하는걸까?>

 

예제 코드를 작성해봐도, 포럼의 사람과 똑같이 link 에러가 발생한다.

오픈 소스 찾아보기

https://github.com/JCube001/qt-opengl-example/tree/master

 

GitHub - JCube001/qt-opengl-example: Example for how to create custom OpenGL widgets in a Qt project

Example for how to create custom OpenGL widgets in a Qt project - JCube001/qt-opengl-example

github.com

 

시도해봤지만 여전히 not found이다...

 

qt 버전 확인

아... 이런..

deprecated일 가능성을 조금만 생각했다면 찾아볼 수 있었는데..

이제서야 검색해본게 한심하다.

 

하지만 찾았으니 해결 방법을 알아보자. qt6 버전 기준으로 opengl을 찾아야한다. link 문제도 다 deprecated된 것일 가능성이 크다. 

검색하니 확실히 qt6, qopenglwidget이 연관으로 나오는 걸 보면 버전 이슈가 맞는 모양이다.

 

하지만 문제는 QOpenGLWidget, QOpenGLFunctions를 이용해서 위에서 이미 해봤지만, 

link에러가 떴다는 것이다.

 

qt 5 module 사용

qt 모듈 관련해서 5에서 6로 넘어올 때 삭제된 것들을 추가하는 방법인가 의문이다. 

이걸 해도 여전하다.

 

문제 코드

결국 저 주석친 부분들이 문제이다.

 

qt6 서적 

https://wikidocs.net/251998

 

01. Hello Triangle!

------------------------------------- > ### 1. java * build.gradle ```cpp plugins { id 'java'…

wikidocs.net

이 자료를 따라 해보자.

cpp 쪽을 따라서 cmake file을 만들고, cmake generate를 해본다.

 

엇?

뭐야 이건 된다.

 

커흑

 

add_executable(Step01 Step01.cpp)

target_link_libraries(Step01
        Qt::Core
        Qt::Gui
        Qt::Widgets
        Qt::OpenGL
        Qt::OpenGLWidgets
        OpenGL::GL
        OpenGL::GLU
        # opengl32.lib
        # glu32.lib
)

cmake list에 link libraries들이 문제인 것 같은데..

 

target_link_libraries(untitled PRIVATE Qt${QT_VERSION_MAJOR}::Widgets)
target_link_libraries(untitled PRIVATE Qt${QT_VERSION_MAJOR}::OpenGL)

find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS OpenGLWidgets)
target_link_libraries(untitled PRIVATE Qt${QT_VERSION_MAJOR}::OpenGLWidgets)

기존 library link를 보면 opengl과 opengl widgets만 있었는데,

실행이 되는 경우는 QT이외에 GL과 GPU 라이브러리도 있다.

 

find_package(Qt6 COMPONENTS
        Core
        Gui
        Widgets
        OpenGL
        OpenGLWidgets
        REQUIRED)

혹은 패키지 이거나.

 

CMake link library 테스트

add_executable(Step01 Step01.cpp)

target_link_libraries(Step01
        Qt::Core
        Qt::Gui
        Qt::Widgets
        Qt::OpenGL
        Qt::OpenGLWidgets
        # OpenGL::GL
        # OpenGL::GLU
        # opengl32.lib
        # glu32.lib
)

이렇게 opengl 라이브러리를 빼고 cmake build를 해보자.

 

일단 아까 본 오류중 하나가 발생하긴 한다.

 

 

빌드해보니 아까 보았던 gl 함수 중 glBegin, glColor, glEnd 등 opengl 함수를 link하지 못하는 문제가 생긴다.

결국 qt::opengl qt::openglwidgets 이외에도
opengl 라이브러리가 별도 link되어야한다.

 

728x90
반응형
  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유
  • 카카오스토리 공유