如何使用 c 插件在 gradle 中构建 emcc

Posted

技术标签:

【中文标题】如何使用 c 插件在 gradle 中构建 emcc【英文标题】:How to build with emcc in gradle using c plugin 【发布时间】:2019-06-29 10:25:57 【问题描述】:

我正在尝试使用 gradle 编译带有 emcc 的项目,但到目前为止未能找到任何体面的示例来说明如何完成(或自己学习)。

到目前为止,我尝试做的是以这种方式设置 clang 的路径:

model 
    toolChains 
        clang(Clang) 
            path "<path-to-emcc>"
        
    
    ...

我收到“找不到 C 编译器 'clang'”。信息。 我尝试的下一件事是创建一个指向 emcc 的 clang 符号链接,但又一次惨败。

【问题讨论】:

【参考方案1】:

你能找到解决办法吗?

我遇到了同样的问题,在查看 Gradle 源代码后,这似乎是特定于在 Windows 上运行构建的问题:

ToolSearchPath.java:

private File findExecutable(OperatingSystem operatingSystem, String name) 
    List<File> path = pathEntries.isEmpty() ? operatingSystem.getPath() : pathEntries;
    String exeName = operatingSystem.getExecutableName(name);
    try 
        if (name.contains(File.separator)) 
            return maybeResolveFile(operatingSystem, new File(name), new File(exeName));
        
        for (File pathEntry : path) 
            File resolved = maybeResolveFile(operatingSystem, new File(pathEntry, name), new File(pathEntry, exeName));

由于String exeName = operatingSystem.getExecutableName(name); 这一行,Gradle 实际上是在寻找emcc.exe 而不是emcc.bat

更新@2020-07-14

我可以通过these changes 解决上述问题。 但是现在我遇到了以下更难解决的问题:

> Task :linkDebug FAILED

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':linkDebug'.
> java.lang.NullPointerException (no error message)

在调试 Gradle 自己的代码后,我能够确定这个问题是由于 emlink.py 在 Gradle 的 GccMetadataProvider 使用这些参数探测它以确定链接器版本时没有处理特殊的 -dM -E -v 参数组合引起的。

【讨论】:

以上是关于如何使用 c 插件在 gradle 中构建 emcc的主要内容,如果未能解决你的问题,请参考以下文章

正在使用多个 gradle 插件,这使我无法构建我的 APK 文件

Gradle 与 AGP 构建 API: 进一步完善您的插件!

如何更改 gradle 插件存储库?

使用Gradle但不使用Java插件构建Java项目

在gradle中构建java项目

Gradle构建Java Web应用:Servlet依赖与Tomcat插件(转)