【问题标题】:How does one set a C/C++ include path with Gradle Experimental Plugin?如何使用 Gradle Experimental Plugin 设置 C/C++ 包含路径?
【发布时间】:2016-02-13 00:40:07
【问题描述】:

当我的头文件位于与我的模块的主源文件夹不同的位置时,Android Studio 找不到我的头文件。 #include "SDL_config.h" 语句以红色突出显示(其他 #include 语句很好),这一点很明显。

我已经尝试修改下面的 cppFlags 值,但我开始怀疑这些 cppFlags 是否会被传递给编译器。

有没有人以这种方式设法包含来自其主要源文件夹以外的文件夹中的文件?

我指定 cppFlags,或者可能是 moduleName 甚至源的方式有问题吗?

我可以浏览 SDL2 源并将所有 #include 语句修改为相对 #include 路径,但我并不想修改 SDL2 源。我应该能够以某种方式简单地指定包含路径的列表。

apply plugin: 'com.android.model.application'

model {
...
    android.ndk {
        moduleName = 'main'

        //W:\hello-sdl-android\android-project\app\src\main\jni\SDL2\include
        cppFlags += "-I${file("src/main/jni/SDL2/include")}".toString()
        cppFlags += "-I${file("src/main/jni/SDL2/src")}".toString()
    }

    android.sources {
        main.jni {
            source {
                srcDirs += ['src/main/jni/src']
                srcDirs += ['src/main/jni/SDL2/src']
            }
        }
    }
...
}

更新:以下是有关我当前项目布局的更多信息:

app/src/main/jni app/src/main/jni/src/Main.cpp

此布局是使用我在此处提供的示例项目的直接结果:https://gitlab.com/scannerdarkly/hello-sdl-android

该项目将使用命令行中的 ndk-build 构建 - 我想通过在 Android Studio 中构建更进一步。我的项目将尝试在 GLES2 设备上绘制三角形。

这是我目前项目的链接:

http://www.mediafire.com/download/92577p7vf123l72/hello-sdl-android.zip

【问题讨论】:

    标签: android-studio gradle android-ndk android-gradle-plugin gradle-experimental


    【解决方案1】:

    我使用稍微不同的方法:

    cFlags += "-I" + file("src/main/jni/SDL2/include").absolutePath
    

    .. 这行得通。原因可能是编译器使用不同的工作目录启动,而 absolutePath 解决了这里的任何歧义。

    【讨论】:

    • 谢谢 - 我会在几个小时内试一试,如果有帮助,请告诉您。如果这是答案,我将删除另一个问题。
    • 这仍然不适合我。实际上,我刚刚尝试将有问题的 #include "SDL_config.h" 放入我的 main.cpp 文件中,它似乎可以很好地处理它。当我在编译 SDL2 源代码时遇到了问题。那么我是否需要额外的“moduleName”或某种形式的“sub”模块名称?我对“moduleName”实际上指的是什么感到困惑——当然它意味着一个可执行文件或库——而不是一个单独的 .cpp 文件。我会尽快提供下载链接。让它发挥作用将使其他人受益。
    • 还有一点 - SDL 源文件是 C 文件。Main.cpp 是 C++ 文件。也许我的问题就像在“cppFlags”之外声明“cFlags”一样简单?
    • cFlags 也影响 C++ 文件,因此您的项目不需要两项设置
    • @AlexCohn 在我的情况下,CFlags 对 c++ 文件没有影响,我也为 cppFlags 设置了标题
    【解决方案2】:

    是的!我想通了 - SDL2 源文件是 .C 文件,因此需要使用 CFlags 声明包含路径,而不是 cppFlags。

    【讨论】:

      【解决方案3】:

      这里是使用 gradle 实验插件的更多标题路径的另一种样式,例如 openssl 和一些“abc”库:

      // compile parameters
      
      // include openssl headers C (if you have C files)
      CFlags.add("-isystem${project.rootDir}/external-libraries/openssl/openssl-1.0.2g/include".toString())
      
      // include openssl headers C++ (if you have cpp files)
      cppFlags.add("-isystem${project.rootDir}/external-libraries/openssl/openssl-1.0.2g/include".toString())
      
      // include abc headers C (if you have C files)
      CFlags.add("-I${project.rootDir}/external-libraries/abc/abc-5.5/include".toString())
      
      // include abc headers C++ (if you have cpp files)
      cppFlags.add("-I${project.rootDir}/external-libraries/abc/abc-5.5/include".toString())
      
      // linking parameters
      
      // link libcrypto.so
      ldFlags.add("-L${project.rootDir}/external-libraries/openssl/openssl-1.0.2g/lib/armeabi-v7a".toString())
      ldLibs.add('crypto')
      
      // link libabc.so
      ldFlags.add("-L${project.rootDir}/external-libraries/abc/abc-5.5/lib".toString())
      ldLibs.add('abc')
      

      【讨论】:

        【解决方案4】:

        对于许多标题路径:

        cFlags = "-I" + file("src/main/jni/path1").absolutePath +
             " -I" + file("src/main/jni/path2").absolutePath +
             " -I" + file("src/main/jni/path3").absolutePath
        

        【讨论】:

          猜你喜欢
          • 2020-11-30
          • 1970-01-01
          • 2014-03-03
          • 2017-08-02
          • 1970-01-01
          • 1970-01-01
          • 2021-10-13
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多