2015-04-27 66 views
2

我正在編寫gradle腳本,我試圖編譯C++代碼,我的結構如下。我試圖在下面的機器上編譯我的代碼,它顯示了C++編譯器失敗,而我沒有得到與Maven的問題可以somel使用CPP插件編譯gradle中的C++代碼

的Linux 2.6.32-431.el6.x86_64#1 SMP太陽11月10日22時19分54秒美國東部時間2013 x86_64的x86_64的x86_64的GNU/Linux的

└───src 
    └───main 
     ├───c++ 
     │ ├───headers (headres is having **.h files) 
     │ └───native (native contains **.cpp files) 
     └───resources 
      └───DSresources 
       └───DSLib 

apply plugin: 'cpp' 
//-- set the group for publishing 
group = 'com.rohit.singh' 
/** 
* Initializing GAVC settings 
*/ 
def buildProperties = new Properties() 
file("version.properties").withInputStream { 
    stream -> buildProperties.load(stream) 
} 
//add the jenkins build version to the version 
def env = System.getenv() 
if (env["BUILD_NUMBER"]) buildProperties.engineBuildVersion += "_${env["BUILD_NUMBER"]}" 
version = buildProperties.engineBuildVersion 
println "${version}" 

//name is set in the settings.gradle file 
group = "com.rohit.singh" 
version = buildProperties.engineBuildVersion 
println "Building ${project.group}:${project.name}:${project.version}" 

model { 
    components { 
    main(NativeExecutableSpec) { 
     targetPlatform "x86" 
     targetPlatform "x64" 
     sources { 
     cpp { 
      source { 
      srcDir "src/main/c++/native" 
      } 
     } 
     } 
    } 
    } 
} 

以下是maven代碼片段

profile> 
      <id>Linux</id> 
      <activation> 
       <os> 
        <family>Linux</family> 
       </os> 
      </activation> 
      <properties> 
       <packaging.type>so</packaging.type> 
      </properties> 
      <build> 
       <plugins> 
        <plugin> 
         <groupId>org.codehaus.mojo</groupId> 
         <artifactId>native-maven-plugin</artifactId> 
         <version>1.0-alpha-8</version> 
         <extensions>true</extensions> 
         <configuration> 

          <javahOS>linux</javahOS> 

          <compilerProvider>generic-classic</compilerProvider> 
          <compilerExecutable>g++</compilerExecutable> 
          <linkerExecutable>g++</linkerExecutable> 
          <sources> 
           <source> 
            <directory>NativeJNI/../src/main/c++/native</directory> 
            <fileNames> 
             <fileName>JniSupport.cpp</fileName> 
             <fileName>DiseaseStagingJni.cpp</fileName> 
            </fileNames> 
           </source> 
          </sources> 
          <compilerStartOptions> 
           <compilerStartOption>-fPIC</compilerStartOption> 
          </compilerStartOptions> 
          <linkerFinalName>NativeJNI</linkerFinalName> 
          <linkerStartOptions> 
           <linkerStartOption>-shared -L${basedir}/src/main/resources/DSresources/DSLib -lds64 -Wl,-rpath,${basedir}/src/main/resources/DSresources/DSLib</linkerStartOption> 
          </linkerStartOptions> 

         </configuration> 
         <executions> 
          <execution> 
           <id>javah</id> 
           <phase>generate-sources</phase> 
           <configuration> 
            <finalName>LinuxNativeJNI</finalName> 
            <javahOS>linux</javahOS> 
            <javahProvider>default</javahProvider> 
            <javahOutputDirectory>${project.build.directory}/custom-javah</javahOutputDirectory> 
            <workingDirectory>${basedir}</workingDirectory> 
            <javahOutputFileName>DiseaseStagingJniWrapper.h</javahOutputFileName> 
            <javahClassNames> 
             <javahClassName>com.truvenwealth.analyticsengine.common.diseasestaging.DiseaseStagingJniWrapper</javahClassName> 
            </javahClassNames> 
           </configuration> 
           <goals> 
            <goal>javah</goal> 
           </goals> 
          </execution> 
         </executions> 
        </plugin> 
        <plugin> 
+1

什麼是錯誤? –

+0

正如我所說的錯誤是說C++編譯器failed.I粘貼我的POM文件片段,因爲在我的問題。 – Sushant

+0

看來你的'srcDir'不包含'headers'目錄。你可以檢查是否添加'srcDir「src/main/C++/headers」'解決你的問題? –

回答

1

我以下面的方式使用了Javah函數。

apply plugin: 'cpp' 
apply plugin: 'java' 
//-- set the group for publishing 
group = 'com.rohit.singh' 

/** 
* Initializing GAVC settings 
*/ 
def buildProperties = new Properties() 
file("version.properties").withInputStream { 
     stream -> buildProperties.load(stream) 
} 
//add the jenkins build version to the version 
def env = System.getenv() 
if (env["BUILD_NUMBER"]) buildProperties.ncdefBuildVersion += "_${env["BUILD_NUMBER"]}" 
version = buildProperties.anal 
println "${version}" 

//name is set in the settings.gradle file 
group = "com.rohit.singh" 
version = buildProperties.anal 
println "Building ${project.group}:${project.name}:${project.version}" 

repositories { 
    maven { 
     url "http://xxx.tsh.xxon.com:x/factory/libslocal" 
    } 
    maven { 
     url "http://xxx.tsh.xxon.com:x/factory/libs-release" 
    } 
} 
    dependencies { 
    compile ([ 
    "com.rohit.singh:engine-common:4.+" 
     ]) 
} 



model { 
    repositories { 
    libs(PrebuiltLibraries) { 
     jdk { 
     headers.srcDirs "${System.properties['java.home']}/../include", 
     "${System.properties['java.home']}/../include/win32", 
     "${System.properties['java.home']}/../include/darwin", 
     "${System.properties['java.home']}/../include/linux" 
     } 
    } 
    } 
} 

model { 
    platforms { 
    x64 { architecture "x86_64" } 
    x86 { architecture "x86" } 
    } 
} 

model { 
    components { 
    main(NativeLibrarySpec) { 
     sources { 
     cpp { 
      source { 
      lib library: 'main', linkage: 'static' 
      lib library: 'jdk', linkage: 'api' 
      srcDir "src/main/c++/native" 
      include "**/JniSupport.cpp" 
      include "**/DiseaseStagingJni.cpp" 
      } 
     } 
     } 
    } 
    } 
} 

def nativeHeadersDir = file("$buildDir/nativeHeaders") 
//def compilePath = configurations.compile.resolve().collect {it.absolutePath}.join(";") 
binaries.all { 
    // Define toolchain-specific compiler and linker options 
    if (toolChain in Gcc) { 
     cppCompiler.args "-I${nativeHeadersDir}" 
     cppCompiler.args "-g" 
     linker.args '-Xlinker', '-shared -LNativeJNI/src/main/resources/DSresources/DSLib -lds64 -Wl' 
} 
} 

**//def nativeHeadersDir = file("$buildDir/nativeHeaders") 
task nativeHeaders { 
    // def nativeHeadersDir = file("$buildDir/nativeHeaders") 
    def outputFile = file("$nativeHeadersDir/DiseaseStagingJniWrapper.h") 
    def classes = [ 
      'com.abcedefgh.nice.common.diseasestaging.DiseaseStagingJniWrapper' 
        ] 
    inputs.files sourceSets.main.output 
    inputs.property('classes', classes) 
    outputs.file outputFile 
    doLast { 
     outputFile.parentFile.mkdirs() 
     def compilePath = configurations.compile.resolve().collect {it.absolutePath}.join(":") 
     println "Using Compile Path: ${compilePath}" 
     exec { 
      executable org.gradle.internal.jvm.Jvm.current().getExecutable('javah') 
      args '-o', outputFile 
      args '-classpath', compilePath 
      args classes 
     } 
    } 
} 

      tasks.withType(CppCompile) { task -> 
       task.dependsOn nativeHeaders 
      }** 
//def filechange = file("NativeJNI-${project.version}.so") 
//println filechange 
task fixartifactname (type: Copy) { 
     //def filechange = "NativeJNI-${project.version}.so" 
     //println filechange 
     from 'build/binaries/mainSharedLibrary' 
     into 'build/libs' 
def filechange = file("NativeJNI-${project.version}.so") 
println filechange 
include('libmain.so') 
rename ('libmain.so', '${filechange}') 
} 
//println fixartifactname 
build.dependsOn fixartifactname