如何使用 Gradle 实验插件设置 C/C++ 包含路径?
How does one set a C/C++ include path with Gradle Experimental Plugin?
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 <- 这是编译
app/src/main/jni/SDL2 <- 所有 SDL2 源都在这里
app/src/main/jni/GLM <- 所有 GLM 源都在此处
此布局是使用我在此处提供的示例项目的直接结果:https://gitlab.com/scannerdarkly/hello-sdl-android
该项目将使用命令行中的 ndk-build 构建 - 我想通过在 Android Studio 中构建来更进一步。我的项目将尝试在 GLES2 设备上绘制一个三角形。
这是我目前的项目 link:
http://www.mediafire.com/download/92577p7vf123l72/hello-sdl-android.zip
我使用的方法略有不同:
cFlags += "-I" + file("src/main/jni/SDL2/include").absolutePath
.. 这行得通。原因可能是编译器使用不同的工作目录启动,absolutePath 解决了此处的任何歧义。
是的!我想通了 - SDL2 源文件是 .C 文件,因此需要使用 CFlags 声明包含路径,而不是 cppFlags。
对于许多 header 路径:
cFlags = "-I" + file("src/main/jni/path1").absolutePath +
" -I" + file("src/main/jni/path2").absolutePath +
" -I" + file("src/main/jni/path3").absolutePath
这里是使用 gradle 实验性插件的更多 header 路径的另一种样式,例如使用 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')
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 <- 这是编译 app/src/main/jni/SDL2 <- 所有 SDL2 源都在这里 app/src/main/jni/GLM <- 所有 GLM 源都在此处
此布局是使用我在此处提供的示例项目的直接结果:https://gitlab.com/scannerdarkly/hello-sdl-android
该项目将使用命令行中的 ndk-build 构建 - 我想通过在 Android Studio 中构建来更进一步。我的项目将尝试在 GLES2 设备上绘制一个三角形。
这是我目前的项目 link:
http://www.mediafire.com/download/92577p7vf123l72/hello-sdl-android.zip
我使用的方法略有不同:
cFlags += "-I" + file("src/main/jni/SDL2/include").absolutePath
.. 这行得通。原因可能是编译器使用不同的工作目录启动,absolutePath 解决了此处的任何歧义。
是的!我想通了 - SDL2 源文件是 .C 文件,因此需要使用 CFlags 声明包含路径,而不是 cppFlags。
对于许多 header 路径:
cFlags = "-I" + file("src/main/jni/path1").absolutePath +
" -I" + file("src/main/jni/path2").absolutePath +
" -I" + file("src/main/jni/path3").absolutePath
这里是使用 gradle 实验性插件的更多 header 路径的另一种样式,例如使用 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')