LINUX.ORG.RU

Не могу слинковать C: линкер не видит две (лишь две) gl-функции

 , ,


1

1

Привет всем!

Изначально решил ориентироваться на ES 3.0 (нужно кое-что для пост-обработки в шейдере, чего нет в 2.0). Собираю с gradle. Линкер (clang++) находит все символы (из портированной с десктопа программы, OpenGL 3.3), кроме glGenVertexArrays и glBindVertexArray. Что не так?

Для примера: вот проект EXL, в нём в конец main.c добавляю 3 строчки:

unsigned int vao;
glGenVertexArrays(1, &vao);
glBindVertexArray(vao);

Чтобы откомпилилось, добавляю в главный CMakeLists.txt (который в ../../) в начало (перед set(GLFM_HEADERS include/glfm.h)) строчку add_definitions(-DGLFM_INCLUDE_ES3)

Получаю при запуске ./gradlew assembleDebug:

...
/path/glfm/the1app/src/main.cpp:245: error: undefined reference to 'glGenVertexArrays'
/path/glfm/the1app/src/main.cpp:247: error: undefined reference to 'glBindVertexArray'
...

Наверное где-то нужно что-то прописать, может версию ES, может android API. Что, где?

Спасибо.

==========

ОФФ. Для EXL, апдэйт: Подумал, понял что с «файликом» я что-то самодеятельничаю... Попробовал set/getenv, оказалось не просто, а очень просто. Зря боялся :) Спасибо!

Однако вскоре (когда выбирал десктопную гую для лончера) я наткнулся на nuklear — OpenGL GUI, с которой возможно лончер вообще не понадобится. Это было бы здорово, поскольку наэкранные кнопочки рисовать мне нужно по-любому, и с лончером мне предстоит делать 3 гуи: свою наэкранную колхозить, андроидный лончер и десктопный (а в перспективе ещё и 4-ую, для ios). А с nuklear возможно всё получится супер, 1 гуя, и всё мега-убер-кроссплатформенно! Я когда-то давно эту nuklear видел, но не увидел явной поддержки андроида, и пропустил мимо. А сейчас присмотрелся — самое то! Главное чтоб fps не сильно просели из-за immediate mode. Причём именно оригинал, не nuklear+, который отбирает у меня main loop. Но пока — сначало надо слинковать под андроид.


Наверное где-то нужно что-то прописать, может версию ES, может android API. Что, где?

Посмотри, как сделано тут:

https://github.com/googlesamples/android-ndk/blob/master/gles3jni/app/src/main/cpp/CMakeLists.txt

Наверное тебе нужно явно линковать GLESv3, если ты это не делаешь. Тред прочитал по диагонали.

EXL ★★★★★ ()

используй epoxy или другую библиотеку для динамической связки с gl. либо грузи gl динамически и вызывай функции по указателям
Если нужен android - возможно стоит задуматься о поддержке gles2. gles3 хоть и есть почти на всех новых устройствах, есть и куча старых.

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

Спасибо. Пример этот раньше не смотрел, сейчас сразу не получилось, посмотрю повнимательнее...

mittorn

используй epoxy или другую библиотеку

Ох, я немного пока не эксперт для таких изменений, я предпочёл бы сделать всё в русле своего апстрима (glfm).

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

https://github.com/vurtun/nuklear/blob/master/demo/sdl_opengles2/nuklear_sdl_...

SDL не пойдёт?
Вариант SDL + gles2 - поддержка почти всех android/ios устройств. Для десктопа можно прикрутить растровый, если вдруг захочется поддерживать системы без аппаратного ускорения

Ну и разумеется SDL доступен и на десктопе

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

Спасибо, SDL не пойдёт. Просто недавно уже выбирал, и выбрал путь: GLFM. Я уже подразобрался с ней (этой либой), и уже пере-структурировал десктопный прототип под неё, так что сейчас всё выглядит мега-кроссплатформенно (поэтому я вообще сейчас в восторге от glfm!).

А эта проблемка должна будет решиться легко. Раз есть пример (спасибо EXL) — наверняка разберусь в чём дело.

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

сейчас сразу не получилось, посмотрю повнимательнее…

Меня смутило:

добавляю в главный CMakeLists.txt

Вы добавляете не в главный, а в тот, что у либы. Что если сделать в главном:

$ git diff
diff --git a/glfm-example/CMakeLists.txt b/glfm-example/CMakeLists.txt
index 675c150..3fadce9 100644
--- a/glfm-example/CMakeLists.txt
+++ b/glfm-example/CMakeLists.txt
@@ -1,8 +1,9 @@
 cmake_minimum_required(VERSION 3.6.0) # Might run on earlier versions. Probably requires 3.4 or 3.5
 
 add_subdirectory(glfm)
+add_definitions(-DGLFM_INCLUDE_ES3)
 
-link_libraries(glfm)
+link_libraries(glfm GLESv3)
 list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}/cmake")
 
 # Common

?

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

Вобщем, всё, получилось. Вроде 2 вещи нужно было сделать:

  • В app/build.gradle указать minSdkVersion 18
  • И в главном (в том, в котором добавил add_definitions(-DGLFM_INCLUDE_ES3)) CMakeLists.txt добавить target_link_libraries(... GLESv3)

Спасибо за пример!

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

P.S. Не обновляйте NDK (сегодня прилетело обновление), гугловцы что-то там всё попереломали и у меня вместо андроидовых либ линкуются хостовые /usr/lib/libEGL.so, /usr/lib/libGLESv2.so

EXL ★★★★★ ()