天天看點

【我的OpenGL學習進階之旅】解決NDK使用OpenGL ES 3.0 的api報錯:error: undefined reference to ‘glUnmapBuffer‘一、錯誤描述二、排查問題三、新問題四、分析新問題五、總結

一、錯誤描述

今天在寫一個OpenGL ES 3.0的demo的時候,編譯報錯,如下所示:

D:/GitLab Source/OpenGLESDemo/app/src/main/cpp/triangle/NativeTriangleMapBuffers.cpp
:162: error: undefined reference to 'glUnmapBuffer'
           
【我的OpenGL學習進階之旅】解決NDK使用OpenGL ES 3.0 的api報錯:error: undefined reference to ‘glUnmapBuffer‘一、錯誤描述二、排查問題三、新問題四、分析新問題五、總結

完整錯誤日志,如下所示:

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':app:externalNativeBuildDebug'.
> Build command failed.
  Error while executing process C:\Android\sdk\cmake\3.10.2.4988404\bin\ninja.exe with arguments {-C D:\GitLab Source\OpenGLESDemo\app\.cxx\cmake\debug\armeabi-v7a opengles-lesson-lib}
  ninja: Entering directory `D:\GitLab Source\OpenGLESDemo\app\.cxx\cmake\debug\armeabi-v7a'
  [1/8] Building CXX object CMakeFiles/opengles-lesson-lib.dir/lesson1/Native1Lesson.cpp.o
  [2/8] Building CXX object CMakeFiles/opengles-lesson-lib.dir/triangle/NativeTriangle.cpp.o
  [3/8] Building CXX object CMakeFiles/opengles-lesson-lib.dir/triangle/NativeTriangle3.cpp.o
  [4/8] Building CXX object CMakeFiles/opengles-lesson-lib.dir/graphics/GLUtils.cpp.o
  [5/8] Building CXX object CMakeFiles/opengles-lesson-lib.dir/triangle/NativeTriangle2.cpp.o
  [6/8] Building CXX object CMakeFiles/opengles-lesson-lib.dir/triangle/NativeTriangleMapBuffers.cpp.o
  [7/8] Building CXX object CMakeFiles/opengles-lesson-lib.dir/graphics/Matrix.cpp.o
  [8/8] Linking CXX shared library "D:\GitLab Source\OpenGLESDemo\app\build\intermediates\cmake\debug\obj\armeabi-v7a\libopengles-lesson-lib.so"
  FAILED: D:/GitLab Source/OpenGLESDemo/app/build/intermediates/cmake/debug/obj/armeabi-v7a/libopengles-lesson-lib.so 
  cmd.exe /C "cd . && C:\Android\SDK\ndk-bundle\toolchains\llvm\prebuilt\windows-x86_64\bin\clang++.exe --target=armv7-none-linux-androideabi16 --gcc-toolchain=C:/Android/SDK/ndk-bundle/toolchains/llvm/prebuilt/windows-x86_64 --sysroot=C:/Android/SDK/ndk-bundle/toolchains/llvm/prebuilt/windows-x86_64/sysroot -fPIC -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -march=armv7-a -mthumb -Wformat -Werror=format-security  -std=c++11 -O0 -fno-limit-debug-info  -Wl,--exclude-libs,libgcc.a -Wl,--exclude-libs,libgcc_real.a -Wl,--exclude-libs,libatomic.a -static-libstdc++ -Wl,--build-id -Wl,--fatal-warnings -Wl,--exclude-libs,libunwind.a -Wl,--no-undefined -Qunused-arguments -shared -Wl,-soname,libopengles-lesson-lib.so -o "D:\GitLab Source\OpenGLESDemo\app\build\intermediates\cmake\debug\obj\armeabi-v7a\libopengles-lesson-lib.so" CMakeFiles/opengles-lesson-lib.dir/graphics/GLUtils.cpp.o CMakeFiles/opengles-lesson-lib.dir/graphics/Matrix.cpp.o CMakeFiles/opengles-lesson-lib.dir/lesson1/Native1Lesson.cpp.o CMakeFiles/opengles-lesson-lib.dir/triangle/NativeTriangle.cpp.o CMakeFiles/opengles-lesson-lib.dir/triangle/NativeTriangle2.cpp.o CMakeFiles/opengles-lesson-lib.dir/triangle/NativeTriangle3.cpp.o CMakeFiles/opengles-lesson-lib.dir/triangle/NativeTriangleMapBuffers.cpp.o  -lEGL -lGLESv2 -landroid -llog -latomic -lm && cd ."
  D:/GitLab Source/OpenGLESDemo/app/src/main/cpp/triangle/NativeTriangleMapBuffers.cpp:125: error: undefined reference to 'glMapBufferRange'
  D:/GitLab Source/OpenGLESDemo/app/src/main/cpp/triangle/NativeTriangleMapBuffers.cpp:138: error: undefined reference to 'glUnmapBuffer'
  D:/GitLab Source/OpenGLESDemo/app/src/main/cpp/triangle/NativeTriangleMapBuffers.cpp:150: error: undefined reference to 'glMapBufferRange'
  D:/GitLab Source/OpenGLESDemo/app/src/main/cpp/triangle/NativeTriangleMapBuffers.cpp:162: error: undefined reference to 'glUnmapBuffer'
  clang++: error: linker command failed with exit code 1 (use -v to see invocation)
  ninja: build stopped: subcommand failed.
  


* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights.

* Get more help at https://help.gradle.org

BUILD FAILED in 11s
12 actionable tasks: 7 executed, 5 up-to-date
           
【我的OpenGL學習進階之旅】解決NDK使用OpenGL ES 3.0 的api報錯:error: undefined reference to ‘glUnmapBuffer‘一、錯誤描述二、排查問題三、新問題四、分析新問題五、總結

二、排查問題

我們排查上面的錯誤日志,發現有一條指令是

CMakeFiles/opengles-lesson-lib.dir/triangle/NativeTriangleMapBuffers.cpp.o 
        -lEGL -lGLESv2 -landroid -llog -latomic -lm
           

咋回事,怎麼是

-lGLESv2

【我的OpenGL學習進階之旅】解決NDK使用OpenGL ES 3.0 的api報錯:error: undefined reference to ‘glUnmapBuffer‘一、錯誤描述二、排查問題三、新問題四、分析新問題五、總結

檢視下CMakeList.txt代碼,原來配置GLES版本配置成了GLESv2

【我的OpenGL學習進階之旅】解決NDK使用OpenGL ES 3.0 的api報錯:error: undefined reference to ‘glUnmapBuffer‘一、錯誤描述二、排查問題三、新問題四、分析新問題五、總結
target_link_libraries( # Specifies the target library.
        opengles-lesson-lib

        EGL
        GLESv2
        android

        # Links the target library to the log library
        # included in the NDK.
        ${log-lib})
           

我們将GLESv2改成GLESv3 即可。

【我的OpenGL學習進階之旅】解決NDK使用OpenGL ES 3.0 的api報錯:error: undefined reference to ‘glUnmapBuffer‘一、錯誤描述二、排查問題三、新問題四、分析新問題五、總結
target_link_libraries( # Specifies the target library.
        opengles-lesson-lib

        EGL
        GLESv3  # OpenGL ES 3.0版本
        android

        # Links the target library to the log library
        # included in the NDK.
        ${log-lib})
           

然後重新編譯一下。

三、新問題

上面将CMakeList.txt代碼,原來配置的GLESv2改成GLESv3,那麼

error: undefined reference to 'glUnmapBuffer'

的問題不存在了。

但是産生了新的問題,如下所示:

D:/GitLab Source/OpenGLESDemo/app/src/main/cpp/triangle/NativeTriangleMapBuffers.cpp
:188: error: undefined reference to 'glDisableVertexAttribArray'
           
【我的OpenGL學習進階之旅】解決NDK使用OpenGL ES 3.0 的api報錯:error: undefined reference to ‘glUnmapBuffer‘一、錯誤描述二、排查問題三、新問題四、分析新問題五、總結

但是我們點開代碼,進入gl3.h 可以看到有這個API的。

【我的OpenGL學習進階之旅】解決NDK使用OpenGL ES 3.0 的api報錯:error: undefined reference to ‘glUnmapBuffer‘一、錯誤描述二、排查問題三、新問題四、分析新問題五、總結

完整錯誤日志如下所示:

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':app:externalNativeBuildDebug'.
> Build command failed.
  Error while executing process C:\Android\sdk\cmake\3.10.2.4988404\bin\ninja.exe with arguments {-C D:\GitLab Source\OpenGLESDemo\app\.cxx\cmake\debug\armeabi-v7a opengles-lesson-lib}
  ninja: Entering directory `D:\GitLab Source\OpenGLESDemo\app\.cxx\cmake\debug\armeabi-v7a'
  [1/1] Linking CXX shared library "D:\GitLab Source\OpenGLESDemo\app\build\intermediates\cmake\debug\obj\armeabi-v7a\libopengles-lesson-lib.so"
  FAILED: D:/GitLab Source/OpenGLESDemo/app/build/intermediates/cmake/debug/obj/armeabi-v7a/libopengles-lesson-lib.so 
  cmd.exe /C "cd . && C:\Android\SDK\ndk-bundle\toolchains\llvm\prebuilt\windows-x86_64\bin\clang++.exe --target=armv7-none-linux-androideabi16 --gcc-toolchain=C:/Android/SDK/ndk-bundle/toolchains/llvm/prebuilt/windows-x86_64 --sysroot=C:/Android/SDK/ndk-bundle/toolchains/llvm/prebuilt/windows-x86_64/sysroot -fPIC -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -march=armv7-a -mthumb -Wformat -Werror=format-security  -std=c++11 -O0 -fno-limit-debug-info  -Wl,--exclude-libs,libgcc.a -Wl,--exclude-libs,libgcc_real.a -Wl,--exclude-libs,libatomic.a -static-libstdc++ -Wl,--build-id -Wl,--fatal-warnings -Wl,--exclude-libs,libunwind.a -Wl,--no-undefined -Qunused-arguments -shared -Wl,-soname,libopengles-lesson-lib.so -o "D:\GitLab Source\OpenGLESDemo\app\build\intermediates\cmake\debug\obj\armeabi-v7a\libopengles-lesson-lib.so" CMakeFiles/opengles-lesson-lib.dir/graphics/GLUtils.cpp.o CMakeFiles/opengles-lesson-lib.dir/graphics/Matrix.cpp.o CMakeFiles/opengles-lesson-lib.dir/lesson1/Native1Lesson.cpp.o CMakeFiles/opengles-lesson-lib.dir/triangle/NativeTriangle.cpp.o CMakeFiles/opengles-lesson-lib.dir/triangle/NativeTriangle2.cpp.o CMakeFiles/opengles-lesson-lib.dir/triangle/NativeTriangle3.cpp.o CMakeFiles/opengles-lesson-lib.dir/triangle/NativeTriangleMapBuffers.cpp.o  -lEGL -lGLESv3 -landroid -llog -latomic -lm && cd ."
  C:/Android/SDK/ndk-bundle/toolchains/llvm/prebuilt/windows-x86_64/lib/gcc/arm-linux-androideabi/4.9.x/../../../../arm-linux-androideabi/bin\ld: error: cannot find -lGLESv3
  D:/GitLab Source/OpenGLESDemo/app/src/main/cpp/graphics/GLUtils.cpp:78: error: undefined reference to 'glCreateProgram'
  D:/GitLab Source/OpenGLESDemo/app/src/main/cpp/graphics/GLUtils.cpp:84: error: undefined reference to 'glAttachShader'
  D:/GitLab Source/OpenGLESDemo/app/src/main/cpp/graphics/GLUtils.cpp:87: error: undefined reference to 'glAttachShader'
  D:/GitLab Source/OpenGLESDemo/app/src/main/cpp/graphics/GLUtils.cpp:90: error: undefined reference to 'glLinkProgram'
  D:/GitLab Source/OpenGLESDemo/app/src/main/cpp/graphics/GLUtils.cpp:94: error: undefined reference to 'glGetProgramiv'
  D:/GitLab Source/OpenGLESDemo/app/src/main/cpp/graphics/GLUtils.cpp:99: error: undefined reference to 'glGetProgramiv'
  D:/GitLab Source/OpenGLESDemo/app/src/main/cpp/graphics/GLUtils.cpp:103: error: undefined reference to 'glGetProgramInfoLog'
  D:/GitLab Source/OpenGLESDemo/app/src/main/cpp/graphics/GLUtils.cpp:109: error: undefined reference to 'glDeleteProgram'
  D:/GitLab Source/OpenGLESDemo/app/src/main/cpp/graphics/GLUtils.cpp:113: error: undefined reference to 'glDeleteShader'
  D:/GitLab Source/OpenGLESDemo/app/src/main/cpp/graphics/GLUtils.cpp:114: error: undefined reference to 'glDeleteShader'
  D:/GitLab Source/OpenGLESDemo/app/src/main/cpp/graphics/GLUtils.cpp:31: error: undefined reference to 'glCreateShader'
  D:/GitLab Source/OpenGLESDemo/app/src/main/cpp/graphics/GLUtils.cpp:37: error: undefined reference to 'glShaderSource'
  D:/GitLab Source/OpenGLESDemo/app/src/main/cpp/graphics/GLUtils.cpp:40: error: undefined reference to 'glCompileShader'
  D:/GitLab Source/OpenGLESDemo/app/src/main/cpp/graphics/GLUtils.cpp:43: error: undefined reference to 'glGetShaderiv'
  D:/GitLab Source/OpenGLESDemo/app/src/main/cpp/graphics/GLUtils.cpp:48: error: undefined reference to 'glGetShaderiv'
  D:/GitLab Source/OpenGLESDemo/app/src/main/cpp/graphics/GLUtils.cpp:53: error: undefined reference to 'glGetShaderInfoLog'
  D:/GitLab Source/OpenGLESDemo/app/src/main/cpp/graphics/GLUtils.cpp:59: error: undefined reference to 'glDeleteShader'
  D:/GitLab Source/OpenGLESDemo/app/src/main/cpp/lesson1/Native1Lesson.cpp:5: error: undefined reference to 'glGetString'
  D:/GitLab Source/OpenGLESDemo/app/src/main/cpp/lesson1/Native1Lesson.cpp:131: error: undefined reference to 'glViewport'
  D:/GitLab Source/OpenGLESDemo/app/src/main/cpp/lesson1/Native1Lesson.cpp:147: error: undefined reference to 'glClearColor'
  D:/GitLab Source/OpenGLESDemo/app/src/main/cpp/lesson1/Native1Lesson.cpp:148: error: undefined reference to 'glClear'
  D:/GitLab Source/OpenGLESDemo/app/src/main/cpp/lesson1/Native1Lesson.cpp:151: error: undefined reference to 'glUseProgram'
  D:/GitLab Source/OpenGLESDemo/app/src/main/cpp/lesson1/Native1Lesson.cpp:154: error: undefined reference to 'glGetUniformLocation'
  D:/GitLab Source/OpenGLESDemo/app/src/main/cpp/lesson1/Native1Lesson.cpp:155: error: undefined reference to 'glGetAttribLocation'
  D:/GitLab Source/OpenGLESDemo/app/src/main/cpp/lesson1/Native1Lesson.cpp:156: error: undefined reference to 'glGetAttribLocation'
  D:/GitLab Source/OpenGLESDemo/app/src/main/cpp/lesson1/Native1Lesson.cpp:10: error: undefined reference to 'glGetError'
  D:/GitLab Source/OpenGLESDemo/app/src/main/cpp/lesson1/Native1Lesson.cpp:10: error: undefined reference to 'glGetError'
  D:/GitLab Source/OpenGLESDemo/app/src/main/cpp/lesson1/Native1Lesson.cpp:183: error: undefined reference to 'glVertexAttribPointer'
  D:/GitLab Source/OpenGLESDemo/app/src/main/cpp/lesson1/Native1Lesson.cpp:191: error: undefined reference to 'glEnableVertexAttribArray'
  D:/GitLab Source/OpenGLESDemo/app/src/main/cpp/lesson1/Native1Lesson.cpp:193: error: undefined reference to 'glVertexAttribPointer'
  D:/GitLab Source/OpenGLESDemo/app/src/main/cpp/lesson1/Native1Lesson.cpp:201: error: undefined reference to 'glEnableVertexAttribArray'
  D:/GitLab Source/OpenGLESDemo/app/src/main/cpp/lesson1/Native1Lesson.cpp:209: error: undefined reference to 'glUniformMatrix4fv'
  D:/GitLab Source/OpenGLESDemo/app/src/main/cpp/lesson1/Native1Lesson.cpp:211: error: undefined reference to 'glDrawArrays'
  D:/GitLab Source/OpenGLESDemo/app/src/main/cpp/triangle/NativeTriangle.cpp:76: error: undefined reference to 'glClearColor'
  D:/GitLab Source/OpenGLESDemo/app/src/main/cpp/triangle/NativeTriangle.cpp:8: error: undefined reference to 'glGetString'
  D:/GitLab Source/OpenGLESDemo/app/src/main/cpp/triangle/NativeTriangle.cpp:84: error: undefined reference to 'glViewport'
  D:/GitLab Source/OpenGLESDemo/app/src/main/cpp/triangle/NativeTriangle.cpp:93: error: undefined reference to 'glClear'
  D:/GitLab Source/OpenGLESDemo/app/src/main/cpp/triangle/NativeTriangle.cpp:98: error: undefined reference to 'glUseProgram'
  D:/GitLab Source/OpenGLESDemo/app/src/main/cpp/triangle/NativeTriangle.cpp:122: error: undefined reference to 'glVertexAttribPointer'
  D:/GitLab Source/OpenGLESDemo/app/src/main/cpp/triangle/NativeTriangle.cpp:126: error: undefined reference to 'glEnableVertexAttribArray'
  D:/GitLab Source/OpenGLESDemo/app/src/main/cpp/triangle/NativeTriangle.cpp:138: error: undefined reference to 'glDrawArrays'
  D:/GitLab Source/OpenGLESDemo/app/src/main/cpp/triangle/NativeTriangle2.cpp:8: error: undefined reference to 'glGetString'
  D:/GitLab Source/OpenGLESDemo/app/src/main/cpp/triangle/NativeTriangle2.cpp:86: error: undefined reference to 'glClearColor'
  D:/GitLab Source/OpenGLESDemo/app/src/main/cpp/triangle/NativeTriangle2.cpp:94: error: undefined reference to 'glViewport'
  D:/GitLab Source/OpenGLESDemo/app/src/main/cpp/triangle/NativeTriangle2.cpp:103: error: undefined reference to 'glClear'
  D:/GitLab Source/OpenGLESDemo/app/src/main/cpp/triangle/NativeTriangle2.cpp:108: error: undefined reference to 'glUseProgram'
  D:/GitLab Source/OpenGLESDemo/app/src/main/cpp/triangle/NativeTriangle2.cpp:133: error: undefined reference to 'glVertexAttribPointer'
  D:/GitLab Source/OpenGLESDemo/app/src/main/cpp/triangle/NativeTriangle2.cpp:137: error: undefined reference to 'glEnableVertexAttribArray'
  D:/GitLab Source/OpenGLESDemo/app/src/main/cpp/triangle/NativeTriangle2.cpp:146: error: undefined reference to 'glVertexAttrib4fv'
  D:/GitLab Source/OpenGLESDemo/app/src/main/cpp/triangle/NativeTriangle2.cpp:160: error: undefined reference to 'glDrawArrays'
  D:/GitLab Source/OpenGLESDemo/app/src/main/cpp/triangle/NativeTriangle2.cpp:163: error: undefined reference to 'glDisableVertexAttribArray'
  D:/GitLab Source/OpenGLESDemo/app/src/main/cpp/triangle/NativeTriangle3.cpp:8: error: undefined reference to 'glGetString'
  D:/GitLab Source/OpenGLESDemo/app/src/main/cpp/triangle/NativeTriangle3.cpp:88: error: undefined reference to 'glClearColor'
  D:/GitLab Source/OpenGLESDemo/app/src/main/cpp/triangle/NativeTriangle3.cpp:96: error: undefined reference to 'glViewport'
  D:/GitLab Source/OpenGLESDemo/app/src/main/cpp/triangle/NativeTriangle3.cpp:105: error: undefined reference to 'glClear'
  D:/GitLab Source/OpenGLESDemo/app/src/main/cpp/triangle/NativeTriangle3.cpp:110: error: undefined reference to 'glUseProgram'
  D:/GitLab Source/OpenGLESDemo/app/src/main/cpp/triangle/NativeTriangle3.cpp:115: error: undefined reference to 'glGenBuffers'
  D:/GitLab Source/OpenGLESDemo/app/src/main/cpp/triangle/NativeTriangle3.cpp:117: error: undefined reference to 'glBindBuffer'
  D:/GitLab Source/OpenGLESDemo/app/src/main/cpp/triangle/NativeTriangle3.cpp:118: error: undefined reference to 'glBufferData'
  D:/GitLab Source/OpenGLESDemo/app/src/main/cpp/triangle/NativeTriangle3.cpp:120: error: undefined reference to 'glBindBuffer'
  D:/GitLab Source/OpenGLESDemo/app/src/main/cpp/triangle/NativeTriangle3.cpp:121: error: undefined reference to 'glBufferData'
  D:/GitLab Source/OpenGLESDemo/app/src/main/cpp/triangle/NativeTriangle3.cpp:123: error: undefined reference to 'glBindBuffer'
  D:/GitLab Source/OpenGLESDemo/app/src/main/cpp/triangle/NativeTriangle3.cpp:124: error: undefined reference to 'glBufferData'
  D:/GitLab Source/OpenGLESDemo/app/src/main/cpp/triangle/NativeTriangle3.cpp:127: error: undefined reference to 'glBindBuffer'
  D:/GitLab Source/OpenGLESDemo/app/src/main/cpp/triangle/NativeTriangle3.cpp:137: error: undefined reference to 'glDrawElements'
  D:/GitLab Source/OpenGLESDemo/app/src/main/cpp/triangle/NativeTriangle3.cpp:139: error: undefined reference to 'glDisableVertexAttribArray'
  D:/GitLab Source/OpenGLESDemo/app/src/main/cpp/triangle/NativeTriangle3.cpp:140: error: undefined reference to 'glDisableVertexAttribArray'
  D:/GitLab Source/OpenGLESDemo/app/src/main/cpp/triangle/NativeTriangleMapBuffers.cpp:120: error: undefined reference to 'glGenBuffers'
  D:/GitLab Source/OpenGLESDemo/app/src/main/cpp/triangle/NativeTriangleMapBuffers.cpp:123: error: undefined reference to 'glBufferData'
  D:/GitLab Source/OpenGLESDemo/app/src/main/cpp/triangle/NativeTriangleMapBuffers.cpp:125: error: undefined reference to 'glMapBufferRange'
  D:/GitLab Source/OpenGLESDemo/app/src/main/cpp/triangle/NativeTriangleMapBuffers.cpp:138: error: undefined reference to 'glUnmapBuffer'
  D:/GitLab Source/OpenGLESDemo/app/src/main/cpp/triangle/NativeTriangleMapBuffers.cpp:150: error: undefined reference to 'glMapBufferRange'
  D:/GitLab Source/OpenGLESDemo/app/src/main/cpp/triangle/NativeTriangleMapBuffers.cpp:162: error: undefined reference to 'glUnmapBuffer'
  D:/GitLab Source/OpenGLESDemo/app/src/main/cpp/triangle/NativeTriangleMapBuffers.cpp:186: error: undefined reference to 'glDrawElements'
  D:/GitLab Source/OpenGLESDemo/app/src/main/cpp/triangle/NativeTriangleMapBuffers.cpp:188: error: undefined reference to 'glDisableVertexAttribArray'
  clang++: error: linker command failed with exit code 1 (use -v to see invocation)
  ninja: build stopped: subcommand failed.
  


* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights.

* Get more help at https://help.gradle.org

BUILD FAILED in 7s
15 actionable tasks: 3 executed, 12 up-to-date

           

四、分析新問題

檢視上面的完整錯誤日志,使用的是GLESv3版本,但是感覺gl3.h裡面的API都找不到。

【我的OpenGL學習進階之旅】解決NDK使用OpenGL ES 3.0 的api報錯:error: undefined reference to ‘glUnmapBuffer‘一、錯誤描述二、排查問題三、新問題四、分析新問題五、總結

4.1 分析AndroidManifest.xml中聲明了OpenGL ES版本

AndroidManifest.xml中聲明了OpenGL ES版本,如下所示,應該是沒問題的

【我的OpenGL學習進階之旅】解決NDK使用OpenGL ES 3.0 的api報錯:error: undefined reference to ‘glUnmapBuffer‘一、錯誤描述二、排查問題三、新問題四、分析新問題五、總結
<uses-feature android:glEsVersion="0x00030002"
        android:required="true" />
           

4.2 檢視CMakeList.txt中的OpenGL ES的庫

前面的那個問題,我們修複了OpenGL ES的庫版本為GLESv3,并且錯誤日志也顯示使用了這個版本,是以應該也不是這裡的問題

【我的OpenGL學習進階之旅】解決NDK使用OpenGL ES 3.0 的api報錯:error: undefined reference to ‘glUnmapBuffer‘一、錯誤描述二、排查問題三、新問題四、分析新問題五、總結

4.3 檢視 build.gradle 裡面的 minSdkVersion

檢視官網 https://developer.android.com/guide/topics/graphics/opengl,有如下所示的介紹:

【我的OpenGL學習進階之旅】解決NDK使用OpenGL ES 3.0 的api報錯:error: undefined reference to ‘glUnmapBuffer‘一、錯誤描述二、排查問題三、新問題四、分析新問題五、總結

Android 可通過開放圖形庫 (OpenGL®)(特别是 OpenGL ES API)來支援高性能 2D 和 3D 圖形。OpenGL 是一種跨平台的圖形 API,用于為 3D 圖形處理硬體指定标準的軟體接口。OpenGL ES 是 OpenGL 規範的一種形式,适用于嵌入式裝置。Android 支援多版 OpenGL ES API:

  • OpenGL ES 1.0 和 1.1 - 此 API 規範受 Android 1.0 及更高版本的支援。
  • OpenGL ES 2.0 - 此 API 規範受 Android 2.2(API 級别 8)及更高版本的支援。
  • OpenGL ES 3.0 - 此 API 規範受 Android 4.3(API 級别 18)及更高版本的支援。
  • OpenGL ES 3.1 - 此 API 規範受 Android 5.0(API 級别 21)及更高版本的支援。
注意:要使裝置支援 OpenGL ES 3.0 API,則需要使用由裝置制造商提供的此圖形管道的一個實作。搭載 Android 4.3 或更低版本的裝置可能不支援 OpenGL ES 3.0 API。如需了解如何檢查運作時支援的 OpenGL ES 版本,請參閱檢查 OpenGL ES 版本。

檢視項目的build.gradle檔案,發現minSdkVersion 被設定為 16,不支援OpenGL ES 3.0

【我的OpenGL學習進階之旅】解決NDK使用OpenGL ES 3.0 的api報錯:error: undefined reference to ‘glUnmapBuffer‘一、錯誤描述二、排查問題三、新問題四、分析新問題五、總結

我們将minSdkVersion 設定為 18,然後重新編譯。

【我的OpenGL學習進階之旅】解決NDK使用OpenGL ES 3.0 的api報錯:error: undefined reference to ‘glUnmapBuffer‘一、錯誤描述二、排查問題三、新問題四、分析新問題五、總結

好吧,重新編譯正常。 運作效果如下,一個彩色的三角形。

【我的OpenGL學習進階之旅】解決NDK使用OpenGL ES 3.0 的api報錯:error: undefined reference to ‘glUnmapBuffer‘一、錯誤描述二、排查問題三、新問題四、分析新問題五、總結

五、總結

要是有OpenGL ES 3.0版本,得做如下幾件事情。

  1. 在AndroidManifest.xml中聲明 OpenGL ES 3.0版本。
<uses-feature android:glEsVersion="0x00030002"
        android:required="true" />
           
  1. build.gradle中minSdkVersion得聲明為18以上。
  2. CMakeLists.txt裡面的target_link_libraries,得添加GLESv3庫,不要寫成GLESv2庫了。
【我的OpenGL學習進階之旅】解決NDK使用OpenGL ES 3.0 的api報錯:error: undefined reference to ‘glUnmapBuffer‘一、錯誤描述二、排查問題三、新問題四、分析新問題五、總結

繼續閱讀