如何在clang(Android-Studio)中使用-v获取未定义引用错误的详细输出

时间:2017-07-03 10:00:33

标签: android android-studio android-ndk clang

每当你在Android Studio中遇到链接器错误时,它建议你使用-v来查看调用,但是在哪里放-v命令来获取"详细输出" (according to llvm clang command guide)?

已经尝试过:

externalNativeBuild {
            cmake {
                cppFlags "-frtti -fexceptions -v"
            }
        }

就我注意到的那样,输出中的任何内容都没有改变

  

- stacktrace --debug

Settings > Compiler > Command-line Options  

这显示了更多输出但不是我想要的东西!
非常感谢您的帮助!

编辑

由于我正在编译C文件,我显然不得不使用cFlags。现在gradle文件看起来如下(thx to @Alex Cohn):

apply plugin: 'com.android.application'

android {
    compileSdkVersion 25
    buildToolsVersion "25.0.3"
    defaultConfig {
        applicationId "<my_id>"
        minSdkVersion 16
        targetSdkVersion 25
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
        externalNativeBuild {
            cmake {
                cFlags "-v"
            }
        }
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
    externalNativeBuild {
        cmake {
            path "CMakeLists.txt"
        }
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
        exclude group: 'com.android.support', module: 'support-annotations'
    })
    compile 'com.android.support:appcompat-v7:25.3.1'
    compile 'com.android.support.constraint:constraint-layout:1.0.1'
    testCompile 'junit:junit:4.12'
}

编辑2

在几个C类中添加以下预处理器命令我没有注意到它们没有它,我能够摆脱关于缺失引用的链接器错误:

#ifdef __cplusplus
extern "C"
{
#endif   

// your includes and your code here

#ifdef __cplusplus
}
#endif

1 个答案:

答案 0 :(得分:1)

  1. cppFlags "-frtti -fexceptions -v" clang ++ 任务的cppFlags "-frtti", "-fexceptions", "-v"一样有效,也就是说,为 .cpp 或<获取详细输出strong> .cxx 文件编译。

  2. cFlags "-v"用于为 .c 文件编译生成详细输出。

  3. 要为链接步骤生成详细输出,请修改 CMakeLists.txt 文件,将-v添加到相关的 target_link_libraries 语句,例如

    target_link_libraries(myjnilib android log -v)
    
  4. 上述所有内容可能不足以理解和修复未定义的引用错误。