【问题标题】:Add custom source directory?添加自定义源目录?
【发布时间】:2017-11-02 09:19:38
【问题描述】:

我是 Gradle 新手,正在尝试为 C++ 项目创建跨平台构建脚本。 我希望使用自定义源目录。不是src/{ProjectName}/cppheader/{ProjectName}/cpp。 我的源文件位于与build.gradle 文件处于同一级别的名为srcinclude 的文件夹中。

请看我的项目目录结构图片

如何仅链接到这些源文件夹? gradle cpp 库示例不包括这一点。 我制作的脚本成功构建但不生成 exe。我猜是因为它找不到 cpp 文件。

更好的是如何查看 gradle 使用的路径? options -"-info" 和 "--debug" 似乎没有输出使用的源路径。

以下是我的完整脚本……

apply plugin: 'cpp' 

model { 

    buildTypes {
        debug
        release
    }

    platforms {

        //osx_64 {
            //architecture "x86_64"
            //operatingSystem "osx"
        //}

        windows_x86 {
            architecture "x86"
            operatingSystem "windows"
        }

        windows_64 {
            architecture "x86_64"
            operatingSystem "windows"
        }
    }

    repositories {
        libs(PrebuiltLibraries) { 
            libcinder { 
                headers.srcDir "/../cinder/include/" 
                binaries.withType(StaticLibraryBinary) {
                    if (targetPlatform.operatingSystem.windows) {
                        if (targetPlatform == platforms.windows_x86) {
                            if(buildType == buildTypes.debug) {
                                staticLibraryFile = file("/../cinder/lib/msw/x86/Debug/v140/cinder.lib") 
                            } else if(buildType == buildTypes.release) {
                                staticLibraryFile = file("/../cinder/lib/msw/x86/Release/v140/cinder.lib") 
                            }
                        } else if(targetPlatform == platforms.windows_64) {
                            if(buildType == buildTypes.debug) {
                                staticLibraryFile = file("/../cinder/lib/msw/x64/Debug/v140/cinder.lib") 
                            } else if(buildType == buildTypes.release) {
                                staticLibraryFile = file("/../cinder/lib/msw/x64/Release/v140/cinder.lib") 
                            }
                        } 
                    } //else if(targetPlatform.operatingSystem.o osx) {
                        //if (targetPlatform == platforms.osx_64) {
                            //if(buildType == buildTypes.debug) {
                                //staticLibraryFile = file("/../cinder/lib/macosx/Debug/libcinder.a") 
                            //} else if(buildType == buildTypes.release) {
                                //staticLibraryFile = file("/../cinder/lib/macosx/Release/libcinder.a") 
                            //}
                        //}
                    //}
                }
            }
        }
    }

    components {
        main(NativeExecutableSpec) {
            sources {
                cpp {
                    source {
                        srcDir "src"
                        include "include"
                        cpp.lib library: "libcinder", linkage: "static" 
                    }
                }
            }
        }
    }

/*
    components {
        main(NativeExecutableSpec) {
            sources {
                cpp.lib library: "libcinder", linkage: "static" 
            }
        }
    }
*/    
}

【问题讨论】:

    标签: c++ gradle build.gradle gradlew


    【解决方案1】:

    使用 Gradle C++ 项目的方式与在 Java 项目中的方式不同。

    cpp-application/cpp-library

    这些插件是 introduced in 2018,是构建 C++ 项目的首选方法(请参阅 full documentation)。

    来自“Customizing file and directory locations”的文档:

    plugins {
        id 'cpp-application'
    }
    
    application {
        source.from file('src')
        privateHeaders.from file('src')
        publicHeaders.from file('include')
    }
    
    
    plugins {
        id 'cpp-library'
    }
    
    library {
        source.from file('src')
        privateHeaders.from file('src')
        publicHeaders.from file('include')
    }
    
    

    请注意,通过声明这些,Gradle 将仅在这些目录中搜索(而不是在默认位置 src/main/cpp)。

    带有cpp 插件(已弃用)

    使用软件模型的 cpp 插件是一种较旧的、已弃用的构建 C++ 项目的方法(请参阅 documentation)。

    apply plugin: "cpp"
    
    sources {
        cpp {
            source {
                srcDir "src"
                // Note that this reference to "include" refers to the files that should be matched in this directory and has nothing to do with the include directory
                include "**/*.cpp"
            }
            exportedHeaders {
                srcDir "include"
            }
        }
    }
    
    

    【讨论】:

    • 好东西,我添加了来自Java背景的答案,谢谢。实际问题应该添加。我将创建一个编辑请求
    【解决方案2】:

    使用 Gradle C++ 项目的方式与在 Java 项目中的方式不同。

    如果您来自 C++ 背景,请查看其他答案


    在 Java 中,您可以使用 sourceSets 来配置您的源代码,例如。

    apply plugin: 'java'
    
    sourceSets {
        main {
            java {
                srcDirs = [
                    "$projectDir/src/main/java",
                    "$projectDir/$generatedDir",
                    "$projectDir/config/sql"
                ]
                include '**/*.java'
            }
    
            resources {
                srcDirs = [
                     "$projectDir/src/main/resources"
                ]
    
            }
        }
    
        test {
            java { srcDir 'src/test/java'}
            resources { srcDir 'src/test/resources' }
        }
    
        componentTest {
            java { srcDir 'src/ctest/java' }
            resources { srcDir 'src/ctest/resources' }
        }
    }
    

    【讨论】:

    • 您的意思是作为 cpp 项目的解决方案还是仅 java 项目的解决方案?我认为您的解决方案不适用于 cpp。当我用 cpp 替换 java 时,我得到一个“找不到参数的方法 cpp()”。我也在使用 cpp 插件(应用插件:'cpp')
    • 您询问了自定义来源,我不知道cpp 是什么,它也不包含在问题中。请完善您的问题或提出一个新问题 - 一个正确的问题。
    • 哇!老兄!你在哪里度假? 2年?无论如何,我改用了 CMAKE。
    • 如果可以将其更改为与 C++ 插件兼容,它将正确解决问题。
    猜你喜欢
    • 1970-01-01
    • 2022-01-21
    • 2014-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多