1.undefined reference to問題,根本原因是找不到函數(shù)實現(xiàn),也就是找不到庫。
2.導(dǎo)致找不到庫的原因很多:
- 在cmake中沒設(shè)置GLES
//CMakeLists.txt
target_link_libraries( # Specifies the target library.
native-lib
GLESv3 )
- 由于SDK18之后才支持GLESv3,如果最小SDK小于18,就會找不到GLESv3。所以最小SDK需要設(shè)置成18及以上,如下
// build.gradle(:app)
android {
compileSdkVersion 29
buildToolsVersion "30.0.0"
defaultConfig {
applicationId "com.yao.yaoplayerandroid"
minSdkVersion 18
targetSdkVersion 29
versionCode 1
versionName "1.0"
......
- 插上真機(jī)可以編譯過,不插真機(jī)/虛擬機(jī),編譯報錯undefined reference to
這可能是因為沒有設(shè)置ABI---應(yīng)用程序二進(jìn)制接口。由于插真機(jī)會識別真機(jī)ABI,而不插真機(jī)就沒有ABI導(dǎo)致報錯。 設(shè)置abiFilters 決定了二進(jìn)制文件如何與系統(tǒng)進(jìn)行交互,設(shè)置ndk {abiFilters 'armeabi-v7a'} ,表示當(dāng)前安卓工程支持的平臺類型是 'armeabi-v7a'。
// build.gradle(:app)
android {
compileSdkVersion 29
buildToolsVersion "30.0.0"
defaultConfig {
//設(shè)置該安卓工程支持的平臺類型 引用時
ndk {
abiFilters 'armeabi-v7a'
}
// 設(shè)置cmake編譯時的abi 編譯時
externalNativeBuild {
cmake {
cppFlags "-std=c++11"
abiFilters 'armeabi-v7a'
}
}
}
......