在我的本地文件系统上,我有以下C项目目录结构:
derpus/
src/
derpus/
c/
derpus.c
headers/
build.gradle
derpus.c
的位置:
#include <stdio.h>
#include <stdlib.h>
int main(void) {
puts("Derp!");
return EXIT_SUCCESS;
}
我想使用Gradle Native (C) Plugin来管理derpus
版本的全部范围。具体来说,我希望Gradle:
gradlew
进行所有构建调用;和derpus
将derpus.exe
构建到gradlew
;和gradlew eclipse
时生成Eclipse项目信息,然后我可以将项目导入Eclipse(我已预先安装了Eclipse CDT插件)这是我的build.gradle
:
apply plugin: 'c'
apply plugin: 'eclipse'
sources {
c {
source {
srcDir "src/derpus/c"
include "**/*.c"
}
exportedHeaders {
srcDir "src/derpus/headers"
}
}
}
task wrapper(type: Wrapper) {
gradleVersion = '2.3'
}
显然我应该可以运行gradle wrapper
来处理第一项。但至于编译和构建,没有C插件文档中的任何地方我实际上看到一个命令或构建调用实际上运行编译和构建!
至于第三项,使用Eclipse插件并通过gradlew eclipse
调用它,我想知道是否还需要做任何其他工作,以便生成的项目/设置配置与Eclipse CDT兼容插件期望为了使用C程序。虽然我打算让Gradle处理我的所有构建,但我仍然希望在Eclipse中进行所有开发,因此CDT附带的所有内容(语法高亮,编译等)对我来说非常重要。
答案 0 :(得分:6)
好的,我想出了所有3个,并且认为我会为任何未来的读者发布这个答案。
请注意:对于现代C程序员来说,这个解决方案真的可行:
此外,因为我在Windows上,我选择使用MinGW进行GCC配置,所以如果您使用的是* nix或Mac,或者您更喜欢Cygwin,那么您甚至必须自定义此解决方案进一步
更进一步,我只使用Eclipse Luna,使用最新的Eclipse CDT插件(8.6)和使用Gradle 2.3验证了这一点。
首先,我必须更正我对C插件的使用,将build.gradle
更改为如下所示:
apply plugin: 'c'
apply plugin: 'eclipse'
model {
components {
derpus(NativeExecutableSpec) {
sources {
c(CSourceSet) {
source {
srcDir "src/derpus/c"
include "**/*.c"
}
exportedHeaders {
srcDir "src/derpus/headers"
}
}
}
}
}
}
task wrapper(type: Wrapper) {
gradleVersion = '2.3'
}
这使我可以毫无错误地运行gradle wrapper
。
接下来,我开始发现Gradle Native Binaries文档从未提到编译/构建本机可执行文件的构建调用非常奇怪。我疯狂地猜测它可能正在利用Gradle的“约定优于配置”方法,我跑了gradlew build
- 瞧!巨大的成功。现在在derpus/build/binaries/derpusExecutable
derpus.exe
gradlew eclipse
下!到目前为止,非常好。
当您想要将此Gradle管理的项目导入Eclipse时,真正令人头疼的是,但Eclipse CDT仍然提供了现代C IDE的所有常规功能。
我开始运行derpus/
,它在.project
项目根目录下添加了以下文件:
.settings/language.settings
#include <stdio.h>
我打开Eclipse并将其作为项目导入,但是我遇到了各种各样的错误,当我在derpus.c
文件中悬停F3
并点击.project
时,Eclipse做了没有。很明显,仍然没有正确配置。所以我得到了黑客攻击。
原来你需要:
<buildSpec />
文件,以包含在虚拟项目的<natures />
文件中生成的相同.project
和.cproject
元素dummy
文件复制到实际项目的根目录,然后在文本编辑器中打开它。您想要使用实际项目的名称重命名虚拟项目名称的所有实例;在我的情况下,有3个实例。就我而言,我的虚拟项目实际上命名为derpus
,我的实际项目名为dummy
。因此,我必须在此文件中将derpus
的3个实例更改为<a href="javascript:void(0)" onclick="location.href='http:\\my-url.com'">Link</a>
。您的实际项目现在的行为与使用CDT插件创建的C项目完全相同。别忘了删除你的“虚拟”项目; - )
答案 1 :(得分:1)
您可以借助以下方法将c ++性质添加到项目中:
答案 2 :(得分:0)
刚试过这个(使用Gradle 4.3),我想指出您可以将model
部分简化为:
model {
components {
derpus(NativeExecutableSpec)
}
}
因为源目录默认为"src/derpus/c"
。
答案 3 :(得分:0)
目前,gradle版本6.2.2(新的C ++插件)可用于该任务。包装器任务默认存在。通过添加eclipse插件可以使用Eclipse任务。
plugins {
id 'cpp-application'
id 'eclipse'
}
application {
binaries.configureEach {
def compileTask = compileTask.get()
compileTask.source.from fileTree(dir: "src/derpus/c", include: "**/*.c")
if (toolChain instanceof VisualCpp) {
compileTask.compilerArgs = ["/TC"]
} else if (toolChain instanceof GccCompatibleToolChain) {
compileTask.compilerArgs = ["-x", "c", "-std=c11"]
}
def linkTask = linkTask.get()
if (toolChain instanceof GccCompatibleToolChain) {
linkTask.linkerArgs = ["-nodefaultlibs", "-lc"]
}
}
}
参考:
https://github.com/gradle/native-samples/tree/master/c/application