LINUX.ORG.RU

C++ и OpenGL

 , ,


0

1

Хочу попробовать что то на OpenGL написать, делаю такое в meson.build:

project('learing cpp', 'cpp')
src = ['source/includes/vec2.cpp','source/main.cpp']

incdir = include_directories('source/includes')

glu_dep = dependency('glm')
gl_dep = dependency('GL')
executable('main',src,include_directories:incdir,dependencies: [gl_dep,glu_dep])

И вот сам код на C++
#include <iostream>
#include <vec2.h>
#include <GL/glew.h>
#include <GL/glut.h>
#include <GL/glu.h>

using namespace std;


int main(int argc, char  **argv)
{
    glutInit(&argc, argv);
    return 0;
}

И это не хочет компилироваться ссылаясь на это:
c++  -o main 'main@exe/source_includes_vec2.cpp.o' 'main@exe/source_main.cpp.o' -Wl,--no-undefined -Wl,--as-needed -Wl,--start-group -lGL -Wl,--end-group  
main@exe/source_main.cpp.o: In function `main':
/home/adelprokurov/.cache/gnome-builder/projects/Cpplearning/builds/default-host-без версии/../../../../../../Projects/Cpplearning/source/main.cpp:21: undefined reference to `glutInit'
collect2: ошибка: выполнение ld завершилось с кодом возврата 1

В общем, гуру подскажите что делать то? Как это заставить работать?

★★

Смешались в кучу кони, люди

glu_dep = dependency('glm')

Так GLU или GLM?

undefined reference to `glutInit'

Так GLUT, GLU или GLM?

EXL ★★★★★ ()

И так с любой подсключаемой библиотекой, сделал

#include <GLFW/glfw3.h>

И такая же ошибка:
ninja
[2/2] Linking target main.
FAILED: main 
c++  -o main 'main@exe/source_includes_vec2.cpp.o' 'main@exe/source_main.cpp.o' -Wl,--no-undefined -Wl,--as-needed -Wl,--start-group -lGL -Wl,--end-group  
main@exe/source_main.cpp.o: In function `main':
/home/adelprokurov/.cache/gnome-builder/projects/Cpplearning/builds/default-host-без версии/../../../../../../Projects/Cpplearning/source/main.cpp:12: undefined reference to `glfwInit'
collect2: ошибка: выполнение ld завершилось с кодом возврата 1
ninja: build stopped: subcommand failed.

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

как насчёт прочитать что он тебе делает?

c++  -o main 'main@exe/source_includes_vec2.cpp.o' 'main@exe/source_main.cpp.o' -Wl,--no-undefined -Wl,--as-needed -Wl,--start-group -lGL -Wl,--end-group 

ты линкуешь только libGL

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

И так с любой подсключаемой библиотекой, сделал
#include <GLFW/glfw3.h>

Это не подключение библиотеки, а только заголовочного файла библиотеки.

И такая же ошибка:

Правильно, ведь в meson.build у тебя что попало. Добавь туда необходимые библиотечные зависимости на линковку и вычисти мусор.

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

Ну сделал я максимально чистый meson.build:

project('learing cpp', 'cpp')
src = ['source/main.cpp']
incdir = include_directories('source/includes')

gl_dep = dependency('GL', required: true)
glfw_dep = dependency('GLFW',required: true)

executable('main', src, dependencies: gl_dep)

Но оно все равно пишет ту же ошибку, а только что собранный из исходников GLFW находящийся в /usr/include и /usr/lib не находит
ls /usr/include/GLFW 
glfw3.h  glfw3native.h

Install the project...
-- Install configuration: ""
-- Installing: /usr/include/GLFW
-- Installing: /usr/include/GLFW/glfw3native.h
-- Installing: /usr/include/GLFW/glfw3.h
-- Up-to-date: /usr/lib/cmake/glfw3/glfw3Config.cmake
-- Up-to-date: /usr/lib/cmake/glfw3/glfw3ConfigVersion.cmake
-- Up-to-date: /usr/lib/cmake/glfw3/glfw3Targets.cmake
-- Up-to-date: /usr/lib/cmake/glfw3/glfw3Targets-noconfig.cmake
-- Up-to-date: /usr/lib/pkgconfig/glfw3.pc
-- Up-to-date: /usr/lib/libglfw.so.3.2
-- Up-to-date: /usr/lib/libglfw.so.3
-- Up-to-date: /usr/lib/libglfw.so


playX ★★ ()
Последнее исправление: playX (всего исправлений: 1)

Не знаю почему, но с

glfw_dep = dependency('glfw3', required: true)
заработало

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

Потому что в первом аргументе имя для pkg-config. Из твоего предыдущего сообщения:

/usr/lib/pkgconfig/glfw3.pc

И не делай make install. GLFW можно было и из репозиториев установить.

a1batross ★★★★★ ()

SDL2 советую. Там и SDL2_ttf, SDL2_image, SDL2_mixer (звук), SDL2_net.

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

SDL2 ведь только для 2D разве не так? Да и я уже привык к OpenGL,на Rust'e пилю движок и gfx-rs/gl-rs/glium мне кажутся более удобными чем SDL2

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

SDL2 ведь только для 2D разве не так?

Нет, для OpenGL она заточенна больше, Valve ее использует в своих играх (CS:S, HL, CS:GO, etc).

gfx-rs/gl-rs/glium мне кажутся более удобным

Лел, очень сильно кажуться, это как небо и земля. Хоть что то из этого может вывести текст отрендеренный? Или загрузить картинку png/tif/etc? Звук? Готовый GUI?

linuhs_user ()
Последнее исправление: linuhs_user (всего исправлений: 1)
Ответ на: комментарий от playX
gl_dep = dependency('GL')
glfw_dep = dependency('GLFW')

FIX

 
executable('main', src, dependencies: [gl_dep, glfw_dep])

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

gfx-rs вполне грузит картиночки и рендерит текст :)

//Загрузка изображения
extern crate image;

fn gfx_load_texture<F, R>(factory: &mut F) -> gfx::handle::ShaderResourceView<R, [f32; 4]>
    where F: gfx::Factory<R>,
          R: gfx::Resources
{
    use gfx::format::Rgba8;
    let img = image::open("resources/player.png").unwrap().to_rgba();
    let (width, height) = img.dimensions();
    let kind = gfx::texture::Kind::D2(width as u16, height as u16, gfx::texture::AaMode::Single);
    let (_, view) = factory.create_texture_immutable_u8::<Rgba8>(kind, gfx::texture::Mipmap::Provided, &[&img]).unwrap();
    view
}

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

Грузит картиночки другой crate ж) Так то понятно что оно может текстурки грузить. А текст, ну там нету некоторых опций, ну в приципе терпимо. У SDL_ttf так: https://www.libsdl.org/projects/SDL_ttf/docs/SDL_ttf_frame.html

Еще к SDL2 можно с легкостью прикрутить Nuklear: https://github.com/vurtun/nuklear

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