C++ 如何使用gradle'将外部标题库包含到gradle本机版本中;s(5.3.1)新国家爱普金?

C++ 如何使用gradle'将外部标题库包含到gradle本机版本中;s(5.3.1)新国家爱普金?,c++,gradle,gradle-native,C++,Gradle,Gradle Native,评估gradle native我想包括一个只包含头的库{fmt},用于带有的gradle native多项目 我尝试通过flatDir和maven存储库将其包括在内。文档只提到了基本依赖项。但即便如此,外来代码似乎也必须使用build.gradle文件进行扩展。下面是我最后一次尝试 根目录下的build.gradle allprojects { apply plugin: 'xcode' apply plugin: 'visual-studio' configurati

评估gradle native我想包括一个只包含头的库{fmt},用于带有的gradle native多项目

我尝试通过flatDir和maven存储库将其包括在内。文档只提到了基本依赖项。但即便如此,外来代码似乎也必须使用build.gradle文件进行扩展。下面是我最后一次尝试

根目录下的build.gradle

allprojects {
    apply plugin: 'xcode'
    apply plugin: 'visual-studio'

    configurations {
        fmtLib
    }

    dependencies {
        fmtLib files(file("$rootDir/../fmt"))
    }
}
在库中使用{fmt}的build.gradle

plugins {
    id 'cpp-library'
}

library {
    linkage = [Linkage.SHARED]

    targetMachines = [
        machines.windows.x86_64,
        machines.macOS.x86_64,
        machines.linux.x86_64
    ]

    baseName = "greeter"
}
#define FMT_HEADER_ONLY

#include <iostream>
#include "../public/greeter.hpp"
#include "include/fmt/format.h"

void Greeter::greet() {
    fmt::print("Hello, {}!", "world");
    std::cout << "Hello, " << name << ", your name has " << getNameLength() << " chars." << std::endl;
}

int Greeter::getNameLength() {
    return name.length();
}
greeter.cpp应使用{fmt}

plugins {
    id 'cpp-library'
}

library {
    linkage = [Linkage.SHARED]

    targetMachines = [
        machines.windows.x86_64,
        machines.macOS.x86_64,
        machines.linux.x86_64
    ]

    baseName = "greeter"
}
#define FMT_HEADER_ONLY

#include <iostream>
#include "../public/greeter.hpp"
#include "include/fmt/format.h"

void Greeter::greet() {
    fmt::print("Hello, {}!", "world");
    std::cout << "Hello, " << name << ", your name has " << getNameLength() << " chars." << std::endl;
}

int Greeter::getNameLength() {
    return name.length();
}
#仅定义FMT#U头
#包括
#包括“./public/greeter.hpp”
#包括“include/fmt/format.h”
无效问候者::问候(){
打印(“你好,{}!”,“世界”);

std::cout我自己已经找到了解决方案。不幸的是,gradle在5.3.1之前没有提供更好的解决方案,但是可以通过

def fmtHeaders = file("$rootDir/../fmt/include")

components.main.binaries.whenElementFinalized { binary ->
    project.dependencies {
        if (binary.optimized) {
            add(binary.includePathConfiguration.name, files(fmtHeaders))
        } else {
            add(binary.includePathConfiguration.name, files(fmtHeaders))
        }
    }
}

我自己已经找到了解决方案。不幸的是,gradle直到5.3.1才提供更好的解决方案,但是可以通过

def fmtHeaders = file("$rootDir/../fmt/include")

components.main.binaries.whenElementFinalized { binary ->
    project.dependencies {
        if (binary.optimized) {
            add(binary.includePathConfiguration.name, files(fmtHeaders))
        } else {
            add(binary.includePathConfiguration.name, files(fmtHeaders))
        }
    }
}