Gradle: 如何指定C/C++目标文件的输出目录?

Gradle: How to designate a output directory for C/C++ object files?

我有一个相当简单的 build.gradle 文件,它构建了一个 zlib 目录。不幸的是,生成的 *.o 文件散布在各个目录中。
例如

build/objs/zlib/shared/zlibC/xvtb7xzcn488esep2yp1v714/uncompr.o
build/objs/zlib/shared/zlibC/2osjpf8p443huii37rw8g7o7d/zutil.o
[...]
build/objs/zlib/shared/zlibC/bkho3m4h5simvpsegapx51g54/trees.o
build/objs/zlib/shared/zlibC/2zicemubjlmw82yi1ysriaup4/inflate.o

如何将所有生成的 *.o 文件的输出目录设置为 build/zlib(减去唯一 ID 目录)?

apply plugin: 'c'

FileCollection zlibfiles = files(
            'adler32',
            [...]
            'trees',
            'zutil')

model {
    components {
        zlib(NativeLibrarySpec) {
            sources {
                c {
                    source {
                        srcDir "."
                        include '*.c'
                    }
                    exportedHeaders {
                        srcDir '.'
                    }
                }
            }
        }
    }
    binaries {
        withType(SharedLibraryBinarySpec) {
            if (targetPlatform.operatingSystem.linux) {
                cppCompiler.args '-c', '-g', '-fPIC'
                // relative paths are ignored by Gradle
                // only fully qualified paths are recognized 
                // cppCompiler.args '-I', '../..'
                cppCompiler.args '-I', "${rootDir}/zlib"
                linker.args '-pthread'
            }
        }
    }
}

我有一个查找复制任务,但这里的目标是正确使用 Gradle。我宁愿使用 Gradle 版本的 gcc/g++ '-o' 选项。

task zlibcopy (type: Copy) {
    configurations {
        conf
    }
    dependencies {
        conf fileTree(dir: "${buildDir}/objs/zlib/shared/zlibC/")
    }
    from configurations.conf.getAsFileTree()
    into "${rootDir}/build/client/ps/common/zlib"
}

Gradle: 4.7
中央操作系统:7.4
Java: 1.8.0_144

尝试一下,不会包含唯一目录。

task zlibcopy (type: Copy) {
    zlibfiles.each { File file ->
        println file.name
        from ("${buildDir}/objs/zlib/shared/zlibC/") {
            include "**/${file.name}*"
        }
        includeEmptyDirs = false
        eachFile {
            def (id, name) = it.path.split('/')
            it.relativePath = RelativePath.parse(true, name)
        }
        into "${rootDir}/build/zlib"
    }
}

the last six *.o files are never copied

也许这六个文件未包含在 zlibfiles 中,因此从未包含在内?

显然,Gradle不允许将本机代码输出到指定的输出目录。您可以在唯一标识的输出目录中找到 *.o,在 "shared" 目录中找到 *.so,在 "static" 目录中找到 *.a。该死的