LINUX.ORG.RU

OpenGL Programming Guide 8th Edition, файлы примеров не компилятся


0

3

Приветствую!
Есть такая замечательная книжка http://rutracker.org/forum/viewtopic.php?t=4418099
К ней есть неполный комплект сорцов, которые можно взять здесь (140Мб) http://www.opengl-redbook.com/
или здесь (всего 2.7 Мб, без меди-файлов) https://www.dropbox.com/s/u6b2rtmb4idkabu/oglpg-8th-edition.zip
Но проблема в том, что сорцы написаны вендузятником и не компилятся в моей уютной Ubuntu 12.04 x64
Мой уровень нубства в C/C++ не дает мне переделать их под линукс
Вот к примеру в одном примере (04/Gouraud) там есть Makefile, но после удаления из него опций ‘-mno-cygwin’ и ‘-mwin32’ компилятор выдаёт ошибку, с которой я не знаю, что делать

oglpg-8th-edition/04/Gouraud$ make
g++   -I../../include -c ../../lib/LoadShaders.cpp
../../lib/LoadShaders.cpp: In function ‘const GLchar* ReadShader(const char*)’:
../../lib/LoadShaders.cpp:27:42: error: ‘fopen’ was not declared in this scope
../../lib/LoadShaders.cpp:37:32: error: ‘fseek’ was not declared in this scope
../../lib/LoadShaders.cpp:38:29: error: ‘ftell’ was not declared in this scope
../../lib/LoadShaders.cpp:43:35: error: ‘fread’ was not declared in this scope
../../lib/LoadShaders.cpp:44:20: error: ‘fclose’ was not declared in this scope
make: *** [LoadShaders.o] Error 1
Может кто-нибудь помочь исправить чудо-сорцы чтоб в линуксе собирались?

★★★★★
Ответ на: комментарий от xeiph

Да, я уже собирал простые сорцы с glut, всё работает

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

Чтоб преодолеть именно этот набор ошибок нужно в LoadShaders.cpp добавить #include <stdio.h>

Возможно кто-то уже поправил все эти иходники и выложил? Может надо как-то глубже погуглить?

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

Спасибо, это помогло (правда Makefile чуть поправить пришлось)

oglpg-8th-edition/04/Gouraud$ make
g++   -I../../include gouraud.cpp LoadShaders.o  -L../../lib -lglut -lGLEW -o gouraud
g++   -I../../include gouraud-float.cpp LoadShaders.o  -L../../lib -lglut -lGLEW -o gouraud-float

oglpg-8th-edition/04/Gouraud$ ls
gouraud  gouraud.cpp  gouraud-float  gouraud-float.cpp  gouraud.frag  gouraud.vert  LoadShaders.o  Makefile
Только при запуске сегфолтится...
oglpg-8th-edition/04/Gouraud$ ./gouraud
Segmentation fault (core dumped)

oglpg-8th-edition/04/Gouraud$ ./gouraud-float 
Segmentation fault (core dumped)

af5 ★★★★★
() автор топика
Последнее исправление: af5 (всего исправлений: 1)
Ответ на: комментарий от arturpub
gdb ./gouraud
GNU gdb (Ubuntu/Linaro 7.4-2012.04-0ubuntu2.1) 7.4-2012.04
Copyright (C) 2012 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-linux-gnu".
For bug reporting instructions, please see:
<http://bugs.launchpad.net/gdb-linaro/>...
Reading symbols from /home/af5/Downloads/oglpg-8th-edition/04/Gouraud/gouraud...done.
(gdb) r
Starting program: /home/af5/Downloads/oglpg-8th-edition/04/Gouraud/gouraud 
warning: no loadable sections found in added symbol-file system-supplied DSO at 0x7ffff7ffa000

Program received signal SIGSEGV, Segmentation fault.
0x0000000000000000 in ?? ()
(gdb) bt
#0  0x0000000000000000 in ?? ()
#1  0x00000000004014e2 in init () at gouraud.cpp:30
#2  0x0000000000401835 in main (argc=1, argv=0x7fffffffe218) at gouraud.cpp:131
(gdb) 
af5 ★★★★★
() автор топика
Последнее исправление: af5 (всего исправлений: 1)
Ответ на: комментарий от arturpub

О, спасибо, это помогло! (добавил в 125 строку glewExperimental = GL_TRUE;)
Отлично, остался еще небольшой вагончик кривых сорцов, пойду тыкать палкой их

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

Обожди, тут посчитать надо... Совет — стольник, скачка и анализ сорцов — пятихаточка. Гугление двести, ну трейс ты сам получил. Итого восемь сотен.

Ладно, сегодня по акции так и быть бесплатно ;)

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

Думаю, вопросы еще могут возникнуть, так что кошелёк для контрольной суммы давай в любом случае

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

Блин, опять ускользнул... =)

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

Да, щастье быстро закончилось

oglpg-8th-edition/04/ch04_shadowmap$ make
g++ -g  -I../../include -c ../../lib/LoadShaders.cpp
g++ -g  -I../../include ch04_shadowmap.cpp LoadShaders.o   -lglut -lGLEW -o ch04_shadowmap
In file included from ch04_shadowmap.cpp:8:0:
../../include/vapp.h: In member function ‘virtual void VermillionApplication::Initialize(const char*)’:
../../include/vapp.h:33:23: warning: deprecated conversion from string constant to ‘char*’ [-Wwrite-strings]
In file included from ch04_shadowmap.cpp:11:0:
../../include/vmath.h: In function ‘vmath::Tmat4<T> vmath::lookat(vmath::vecN<T, 3>, vmath::vecN<T, 3>, vmath::vecN<T, 3>)’:
../../include/vmath.h:650:16: error: ‘translate’ was not declared in this scope
../../include/vmath.h:650:27: error: expected primary-expression before ‘>’ token
ch04_shadowmap.cpp: In member function ‘virtual void ShadowMapExample::Display(bool)’:
ch04_shadowmap.cpp:175:34: error: ‘GetTickCount’ was not declared in this scope
make: *** [ch04_shadowmap] Error 1

собираю таким Makefile:

#! make

TARGETS = $(basename $(wildcard *.cpp))

LOAD_SHADERS.src = ../../lib/LoadShaders.cpp
LOAD_SHADERS.obj = LoadShaders.o

CXXOPTS = -g
CXXDEFS = 
CXXINCS = -I../../include

ifdef DEBUG
CXXDEFS += -DDEBUG
endif

CXXFLAGS = $(CXXOPTS) $(CXXDEFS) $(CXXINCS)

LDOPTS =
#LDDIRS = -L../../lib
LDLIBS = -lglut -lGLEW

LDFLAGS = $(LDOPTS) $(LDDIRS) $(LDLIBS)

DIRT = $(wildcard *~ *.o)

#-----------------------------------------------------------------------------

default all: $(TARGETS)

%: %.cpp $(LOAD_SHADERS.obj)
	$(CXX) $(CXXFLAGS) $^ $(LDFLAGS) -o $@

%.i: %.cpp
	$(CXX) $(CXXFLAGS) -E $< | uniq > $@

$(LOAD_SHADERS.obj): $(LOAD_SHADERS.src)
	$(CXX) $(CXXFLAGS) -c $(LOAD_SHADERS.src)

#-----------------------------------------------------------------------------

clean:
	$(RM) $(DIRT)

clobber: clean
	$(RM) $(TARGETS)

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

../../include/vmath.h:650:16: error: ‘translate’ was not declared in this scope

Там translate объявлен сразу после использования. Если перенести его чуть выше (выше lookat), то должно пройти. Хотя я этих ваших крестов не знаю толком.

ch04_shadowmap.cpp:175:34: error: ‘GetTickCount’ was not declared in this scope

http://msdn.microsoft.com/en-us/library/windows/desktop/ms724408(v=vs.85).aspx

Ищи замену, может какой gettimeofday() подойдет. http://www.opennet.ru/man.shtml?topic=gettimeofday&category=2&russian=0

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

oglpg-8th-edition/04/ch04_shadowmap$ make g++ -g -I../../include ch04_shadowmap.cpp LoadShaders.o -lglut -lGLEW -o ch04_shadowmap In file included from ch04_shadowmap.cpp:8:0: ../../include/vapp.h: In member function ‘virtual void VermillionApplication::Initialize(const char*)’: ../../include/vapp.h:33:23: warning: deprecated conversion from string constant to ‘char*’ [-Wwrite-strings] /tmp/ccxM8cB5.o: In function `ShadowMapExample::Initialize(char const*)': /home/af5/Downloads/oglpg-8th-edition/04/ch04_shadowmap/ch04_shadowmap.cpp:170: undefined reference to `VBObject::LoadFromVBM(char const*, int, int, int)' /tmp/ccxM8cB5.o: In function `ShadowMapExample::DrawScene(bool)': /home/af5/Downloads/oglpg-8th-edition/04/ch04_shadowmap/ch04_shadowmap.cpp:259: undefined reference to `VBObject::Render(unsigned int, unsigned int)' /tmp/ccxM8cB5.o: In function `ShadowMapExample': /home/af5/Downloads/oglpg-8th-edition/04/ch04_shadowmap/ch04_shadowmap.cpp:23: undefined reference to `VBObject::VBObject()' /tmp/ccxM8cB5.o: In function `~ShadowMapExample': /home/af5/Downloads/oglpg-8th-edition/04/ch04_shadowmap/ch04_shadowmap.cpp:23: undefined reference to `VBObject::~VBObject()' collect2: ld returned 1 exit status make: *** [ch04_shadowmap] Error 1

af5 ★★★★★
() автор топика
Последнее исправление: af5 (всего исправлений: 1)
Ответ на: комментарий от af5
oglpg-8th-edition/04/ch04_shadowmap$ make
g++ -g  -I../../include ch04_shadowmap.cpp LoadShaders.o   -lglut -lGLEW -o ch04_shadowmap
In file included from ch04_shadowmap.cpp:8:0:
../../include/vapp.h: In member function ‘virtual void VermillionApplication::Initialize(const char*)’:
../../include/vapp.h:33:23: warning: deprecated conversion from string constant to ‘char*’ [-Wwrite-strings]
/tmp/ccxM8cB5.o: In function `ShadowMapExample::Initialize(char const*)':
/home/af5/Downloads/oglpg-8th-edition/04/ch04_shadowmap/ch04_shadowmap.cpp:170: undefined reference to `VBObject::LoadFromVBM(char const*, int, int, int)'
/tmp/ccxM8cB5.o: In function `ShadowMapExample::DrawScene(bool)':
/home/af5/Downloads/oglpg-8th-edition/04/ch04_shadowmap/ch04_shadowmap.cpp:259: undefined reference to `VBObject::Render(unsigned int, unsigned int)'
/tmp/ccxM8cB5.o: In function `ShadowMapExample':
/home/af5/Downloads/oglpg-8th-edition/04/ch04_shadowmap/ch04_shadowmap.cpp:23: undefined reference to `VBObject::VBObject()'
/tmp/ccxM8cB5.o: In function `~ShadowMapExample':
/home/af5/Downloads/oglpg-8th-edition/04/ch04_shadowmap/ch04_shadowmap.cpp:23: undefined reference to `VBObject::~VBObject()'
collect2: ld returned 1 exit status
make: *** [ch04_shadowmap] Error 1
af5 ★★★★★
() автор топика
Ответ на: комментарий от af5

А нет, все норм. Это похоже линкер тебе говорит, что без ../../lib/vbm.cpp было собрано. Надо как-то в makefile его сборку добавить. Или просто к списку сорцов прицепи.

arturpub ★★
()
Ответ на: комментарий от arturpub
oglpg-8th-edition/04/ch04_shadowmap$ make
g++ -g  -I../../include -c ../../lib/vbm.cpp
../../lib/vbm.cpp: In member function ‘bool VBObject::LoadFromVBM(const char*, int, int, int)’:
../../lib/vbm.cpp:47:100: error: ‘memcpy’ was not declared in this scope
../../lib/vbm.cpp:78:109: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast]
../../lib/vbm.cpp:106:93: error: ‘memset’ was not declared in this scope
make: *** [../../lib/vbm.o] Error 1
af5 ★★★★★
() автор топика
Ответ на: комментарий от af5

error: ‘<whatever>’ was not declared in this scope

Такие случаи можно гуглить «<whatever> header file» и вставлять нужный инклуд. Тут #include <string.h> (или #include <cstring>).

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

Такие случаи можно гуглить «<whatever> header file» и вставлять нужный инклуд.

Спасибо, учту

oglpg-8th-edition/04/ch04_shadowmap$ make
g++ -g  -I../../include -c ../../lib/vbm.cpp
../../lib/vbm.cpp: In member function ‘bool VBObject::LoadFromVBM(const char*, int, int, int)’:
../../lib/vbm.cpp:78:109: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast]
g++ -g  -I../../include ch04_shadowmap.cpp vbm.o   -lglut -lGLEW -o ch04_shadowmap
In file included from ch04_shadowmap.cpp:8:0:
../../include/vapp.h: In member function ‘virtual void VermillionApplication::Initialize(const char*)’:
../../include/vapp.h:33:23: warning: deprecated conversion from string constant to ‘char*’ [-Wwrite-strings]
vbm.o: In function `GetTickCount()':
/home/af5/Downloads/oglpg-8th-edition/04/ch04_shadowmap/../../include/vmath.h:13: multiple definition of `GetTickCount()'
/tmp/cc6MCO2d.o:/home/af5/Downloads/oglpg-8th-edition/04/ch04_shadowmap/../../include/vmath.h:13: first defined here
/tmp/cc6MCO2d.o: In function `ShadowMapExample::Initialize(char const*)':
ch04_shadowmap.cpp:(.text+0x4fb): undefined reference to `LoadShaders'
ch04_shadowmap.cpp:(.text+0x56e): undefined reference to `LoadShaders'
collect2: ld returned 1 exit status
make: *** [ch04_shadowmap] Error 1

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

Ты если мой GetTickCount в заголовочный файл сунул, тогда объяви его static int.

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

undefined reference to `LoadShaders'

cd oglpg-8th-edition
grep -rn LoadShaders . | less
...
./include/LoadShaders.h:36:GLuint LoadShaders( ShaderInfo* );
...
./lib/LoadShaders.cpp:54:LoadShaders( ShaderInfo* shaders )
...

Здесь надо прилинковать еще ../../lib/LoadShaders.cpp

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

да, это я с Makefile напутал, исправляю

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

Что-то не могу сообразить, строки 8-9 добавил, а 30-39 как исправить?

#! make

TARGETS = $(basename $(wildcard *.cpp))

LOAD_SHADERS.src = ../../lib/LoadShaders.cpp
LOAD_SHADERS.obj = LoadShaders.o

LOAD_VBM.src = ../../lib/vbm.cpp
LOAD_VBM.obj = vbm.o

CXXOPTS = -g
CXXDEFS = 
CXXINCS = -I../../include

ifdef DEBUG
CXXDEFS += -DDEBUG
endif

CXXFLAGS = $(CXXOPTS) $(CXXDEFS) $(CXXINCS)

LDOPTS =
#LDDIRS = -L../../lib
LDLIBS = -lglut -lGLEW

LDFLAGS = $(LDOPTS) $(LDDIRS) $(LDLIBS)

DIRT = $(wildcard *~ *.o)

#-----------------------------------------------------------------------------

default all: $(TARGETS)

%: %.cpp $(LOAD_SHADERS.obj)
	$(CXX) $(CXXFLAGS) $^ $(LDFLAGS) -o $@

%.i: %.cpp
	$(CXX) $(CXXFLAGS) -E $< | uniq > $@

$(LOAD_SHADERS.obj): $(LOAD_SHADERS.src)
	$(CXX) $(CXXFLAGS) -c $(LOAD_SHADERS.src)

#-----------------------------------------------------------------------------

clean:
	$(RM) $(DIRT)

clobber: clean
	$(RM) $(TARGETS)

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

#-----------------------------------------------------------------------------

default all: $(TARGETS)

%: %.cpp $(LOAD_SHADERS.obj) $(LOAD_VBM.obj)
	$(CXX) $(CXXFLAGS) $^ $(LDFLAGS) -o $@

%.i: %.cpp
	$(CXX) $(CXXFLAGS) -E $< | uniq > $@

$(LOAD_SHADERS.obj): $(LOAD_SHADERS.src)
	$(CXX) $(CXXFLAGS) -c $(LOAD_SHADERS.src)

$(LOAD_VBM.obj): $(LOAD_VBM.src)
	$(CXX) $(CXXFLAGS) -c $(LOAD_VBM.src)

#-----------------------------------------------------------------------------

Вроде так...

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

А если не манерничать, то вообще:

%: %.cpp ../../lib/LoadShaders.cpp ../../lib/vbm.cpp
	$(CXX) $(CXXFLAGS) $^ $(LDFLAGS) -o $@
Остальное (5-9, 39-43) нафиг не надо.

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

О, вроде заработало! Правда какую-то сомнительную анимацию выводит, не уверен, что должно так выглядеть. Надо посмотреть в книжке может найду что там должно быть на самом деле

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

Капец, помоему этот сорц в книге даже не упоминается...
arturpub, спасибо тебе большое за помощь
я спать уже иду, остальное завтра буду смотреть

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

Из oglpg-8th-edition/03/* половина не компилится с такими ошибками

oglpg-8th-edition/03/ch03_xfb$ make
g++ -g  -I../../include -c ../../lib/LoadShaders.cpp
g++ -g  -I../../include -c ../../lib/vbm.cpp
../../lib/vbm.cpp: In member function ‘bool VBObject::LoadFromVBM(const char*, int, int, int)’:
../../lib/vbm.cpp:78:109: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast]
g++ -g  -I../../include -c ../../lib/targa.cpp
g++ -g  -I../../include ch03_xfb.cpp LoadShaders.o vbm.o targa.o   -lglut -lGLEW -o ch03_xfb
In file included from ch03_xfb.cpp:8:0:
../../include/vapp.h: In member function ‘virtual void VermillionApplication::Initialize(const char*)’:
../../include/vapp.h:33:23: warning: deprecated conversion from string constant to ‘char*’ [-Wwrite-strings]
ch03_xfb.cpp: In member function ‘virtual void TransformFeedbackExample::Display(bool)’:
ch03_xfb.cpp:327:97: error: ‘translation’ is not a member of ‘vmath’
ch03_xfb.cpp:329:30: error: ‘rotation’ is not a member of ‘vmath’
ch03_xfb.cpp:330:30: error: ‘rotation’ is not a member of ‘vmath’
make: *** [ch03_xfb] Error 1
а половина компилится, но при запуске появляется только скучное пустое чёрное окно...

af5 ★★★★★
() автор топика
Ответ на: комментарий от af5
ch03_xfb.cpp:327:97: error: ‘translation’ is not a member of ‘vmath’
ch03_xfb.cpp:329:30: error: ‘rotation’ is not a member of ‘vmath’
ch03_xfb.cpp:330:30: error: ‘rotation’ is not a member of ‘vmath’

Починил, тупо опечатка в сорце: не translation а translate, не rotation а rotate

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

Ещё баг нашел, если в ch03_instancing.cpp в 152 строке исправить путь на правильный, то прога при запуске не пустое окно показывает, а сегфолтится

gdb ./ch03_instancing
GNU gdb (Ubuntu/Linaro 7.4-2012.04-0ubuntu2.1) 7.4-2012.04
Copyright (C) 2012 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-linux-gnu".
For bug reporting instructions, please see:
<http://bugs.launchpad.net/gdb-linaro/>...
Reading symbols from /home/af5/Downloads/oglpg-8th-edition/03/ch03_instancing/ch03_instancing...done.
(gdb) r
Starting program: /home/af5/Downloads/oglpg-8th-edition/03/ch03_instancing/ch03_instancing 
warning: no loadable sections found in added symbol-file system-supplied DSO at 0x7ffff7ffa000

Program received signal SIGSEGV, Segmentation fault.
0x0000000000404b13 in VBObject::Render (this=0x609e68, frame_index=0, instances=200) at ../../lib/vbm.cpp:161
161	                glBindTexture(GL_TEXTURE_2D, m_material_textures[material_index].normal);
(gdb) bt
#0  0x0000000000404b13 in VBObject::Render (this=0x609e68, frame_index=0, instances=200) at ../../lib/vbm.cpp:161
#1  0x0000000000402ea5 in InstancingExample::Display (this=0x609e10, auto_redraw=true) at ch03_instancing.cpp:263
#2  0x000000000040210a in VermillionApplication::DisplayFunc () at ch03_instancing.cpp:50
#3  0x00007ffff7bb4137 in ?? () from /usr/lib/x86_64-linux-gnu/libglut.so.3
#4  0x00007ffff7bb7889 in fgEnumWindows () from /usr/lib/x86_64-linux-gnu/libglut.so.3
#5  0x00007ffff7bb45fa in glutMainLoopEvent () from /usr/lib/x86_64-linux-gnu/libglut.so.3
#6  0x000000000040214b in VermillionApplication::MainLoop () at ch03_instancing.cpp:50
#7  0x0000000000402186 in main (argc=1, argv=0x7fffffffe1f8) at ch03_instancing.cpp:50
(gdb) 

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

В vapp.h 49 строкой написал glewExperimental = GL_TRUE; - не помогло

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

C ch04_shadowmap похоже та же самая беда, если исправить путь к media на правильный - сегфолтится

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

Не понял вопроса, и не спец по опенгл'ам, пардоньте.

Из того, что знаю: в винде есть DirectX, OpenGL, SDL (по сути вроде как обертка над OpenGL) и прочие обертки. В линуксах то же самое, только без DirectX. DirectX и OpenGL являются стандартными API (набор функций и параметров), которые напрямую поддерживаются производителями видеокарт. DirectX кстати это не только графика, там еще и звук, ввод, видео, прочее. OpenGL это только 3d-контекст на к-л части экрана. Моим представлениям лет 5-10, если интересно, то лучше спроси в /девелопменте.

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

наифга opengl под линуксу то???

а что вы вместо него предлагаете?

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