MinGW и GLEW

Внезапно понадобилось разобраться в коде чужого проекта. А чтобы это сделать, его надо сначала скомпилировать и запустить, чтобы убедиться, что всё работает. Проект задизайнен под линукс и там есть мейкфайл. Если сразу попытаться его собрать, то выдаются ошибки об отсутствии хидеров. Если скачать все зависимости, то проект всё-равно не компилируется и выдаёт какие-то совершенно нелепые ошибки. Если проделать то же самое на винде, то этих нелепых ошибок нет, зато появляются другие. Эти другие я легко пофиксил. Теперь оно пытается компилироваться, но не может найти библиотеку -lglew32. Внезапно оказалось, что прекомпилированной библиотеки для MinGW не существует и компилировать её надо вручную. Нашел как это делается:

gcc -DGLEW_NO_GLU -O2 -Wall -W -Iinclude -DGLEW_BUILD -o src/glew.o -c src/glew.c
gcc -shared -Wl,-soname,libglew32.dll -Wl,--out-implib,lib/libglew32.dll.a -o lib/glew32.dll src/glew.o -L/mingw/lib -lglu32 -lopengl32 -lgdi32 -luser32 -lkernel32
ar cr lib/libglew32.a src/glew.o

но на второй строчке выдаётся ошибка:


src/glew.o:glew.c:(.text+0x203a0): multiple definition of `DllMainCRTStartup@12'
c:/mingw/bin/../lib/gcc/mingw32/6.3.0/../../../dllcrt2.o:(.text+0x60): first defined here
collect2.exe: error: ld returned 1 exit status

Опять этот multiple definition :japanese_goblin: и что с ним делать?
Библиотеку умные люди годами писали. Откуда в ней multiple definition?
При сборке в вижуалке ведь никакого multiple definitionа нет :thinking:

Может проще поставить линукс в виртуалку?)

это в линуксе

А что за ошибки выдавал?

g++ -o ./bin/tests -g -Wall -Wno-unused-function -L/usr/local/lib -I./include -I/usr/share/include -I/usr/local/libpng/include ./src/*.cpp ./src/Math/*.cpp ./src/UI/*.cpp ./src/Brushes/*.cpp tests.cpp -lGLEW -lglut -lX11 -lGL -lGLU -lm -lstdc++ -lpng -lz
./src/Volume.cpp: In member function ‘void Volume::CopyTris(Vertex*, int)’:
./src/Volume.cpp:430:45: warning: ‘void* memcpy(void*, const void*, size_t)’ writing to an object of non-trivially copyable type ‘struct Vertex’; use copy-assignment or copy-initialization instead [-Wclass-memaccess]
  430 |   memcpy(buffer + StartIndex, Verts, vs * 15);
      |                                             ^
In file included from ./src/Volume.cpp:1:
./src/../include/Volume.h:26:15: note: ‘struct Vertex’ declared here
   26 | typedef struct{
      |               ^

на винде таких ошибок, почему-то, не выдаёт :man_shrugging:
Он на скобки показывает. Я не понимаю, что это значит :man_shrugging:

Так это ж просто предупреждение/совет.

Почему тогда не собирается?

А это весь вывод?

Может собралось?)

Результат видимо этот файл

вот весь:

user@comp:~/Рабочий стол/xxx$ make
g++ -o ./bin/tests -g -Wall -Wno-unused-function -L/usr/local/lib -I./include -I/usr/share/include -I/usr/local/libpng/include ./src/*.cpp ./src/Math/*.cpp ./src/UI/*.cpp ./src/Brushes/*.cpp tests.cpp -lGLEW -lglut -lX11 -lGL -lGLU -lm -lstdc++ -lpng -lz
./src/Volume.cpp: In member function ‘void Volume::CopyTris(Vertex*, int)’:
./src/Volume.cpp:430:45: warning: ‘void* memcpy(void*, const void*, size_t)’ writing to an object of non-trivially copyable type ‘struct Vertex’; use copy-assignment or copy-initialization instead [-Wclass-memaccess]
  430 |   memcpy(buffer + StartIndex, Verts, vs * 15);
      |                                             ^
In file included from ./src/Volume.cpp:1:
./src/../include/Volume.h:26:15: note: ‘struct Vertex’ declared here
   26 | typedef struct{
      |               ^
tests.cpp: In function ‘void MouseHandeler(int, int)’:
tests.cpp:221:1: warning: this ‘if’ clause does not guard... [-Wmisleading-indentation]
  221 | if(keys['r'])
      | ^~
tests.cpp:224:3: note: ...this statement, but the latter is misleadingly indented as if it were guarded by the ‘if’
  224 |   float t = 0;
      |   ^~~~~
user@comp:~/Рабочий стол/xxx$ 

Я поменял имя выходного файла и перекомпилировал еще раз, но новый файл не появился.
Однако, к проекту прилагается уже скомпилированный файл bin/tests. Но при попытке его запуска, выдаётся нет такого файла или каталога. Это у линукса троллинг такой?

./bin/tests

в консоли в той же папке где папка bin лежит.

не понял
а всё понял
но программа в виртуалке не работает

Ну в консоли же есть текущая папка.

Так что чтобы сработала команда ./bin/tests надо чтобы в

лежала папка bin с файлом tests

почему, что выдает?

OpenGL в виртуалке не инициализируется (точнее, шейдеры не грузятся). Я, в принципе, этого и ожидал.
Мне, всё-равно, по-любому, надо этот исходник на винде собрать. А для этого нужен GLEW для MinGW.

А что за проект? OpenGL по идее должен работать и в виртуалке если не что-то сильно сложное. В VMWare Player может лучше.

Ну или можно просто загрузиться в Live версию линукса с флешки.

Про это я знаю. Но в моём случае - не вариант. То есть, вообще.

А если даже и вариант, то исходник, всё-равно, не компилируется.

Там какая-то минимальная демка на основе Marching cubes, если автор не обманул.

а здесь что именно его не устраивает?

Это скорее всего относится к первому варнингу, который советует копировать средствами С++ вместо memcpy

Когда происходит что-то непонятное, надо для начала получить больше инфы.

например

make -d

и/или

g++ -v ......

Я вам наврал. Она существует.
У них на сайте лежит архив с версией 2.1.0, в котором эти либы, почему-то, отсутствуют :thinking: А на гитхабе в архиве с версией 2.2.0 они спокойненько лежат. Я их, почему-то, не увидел :man_facepalming: