Gradle cpp插件未链接共享库 [英] Gradle cpp plugin doesn't link shared library

查看:72
本文介绍了Gradle cpp插件未链接共享库的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个C ++库,可以使用RF24收听广播.我使用带有Java类的JNI来包装此库.

I have a C++ library to listen to radio with RF24. I wrap this library using JNI with a Java class.

我遇到的问题是gradle不要将共享库 librf24.so 链接到我的库 libtransmitter.so 中.

The issue that I have is that gradle don't link the shared library librf24.so into my library libtransmitter.so.

当我在 libtransmitter.so 上呼叫 ldd 时,我有:

When I call ldd on libtransmitter.so I have :

linux-vdso.so.1 (0x7ee24000)
/usr/lib/arm-linux-gnueabihf/libarmmem.so (0x76ecc000)
libstdc++.so.6 => /usr/lib/arm-linux-gnueabihf/libstdc++.so.6 (0x76d73000)
libm.so.6 => /lib/arm-linux-gnueabihf/libm.so.6 (0x76cf4000)
libgcc_s.so.1 => /lib/arm-linux-gnueabihf/libgcc_s.so.1 (0x76cc7000)
libc.so.6 => /lib/arm-linux-gnueabihf/libc.so.6 (0x76b88000)
/lib/ld-linux-armhf.so.3 (0x76ef5000)

librf24.so不存在

librf24.so is not present

这是我的gradle配置:

Here is my gradle configuration :

model {

    platforms {
        raspberry {
            architecture "arm"
            operatingSystem "linux"
        }
    }
    toolChains {
        raspToolChain(Gcc) {
            target("raspberry") {
              //  path 'C:\\SysGCC\\raspberry\\bin'
              //  cCompiler.executable 'arm-linux-gnueabihf-g++.exe'
              //  cppCompiler.executable 'arm-linux-gnueabihf-g++.exe'
              //  assembler.executable 'arm-linux-gnueabihf-g++.exe'
              //  linker.executable 'arm-linux-gnueabihf-g++.exe'
              //  staticLibArchiver.executable 'arm-linux-gnueabihf-ar.exe'
            }
        }
    }

    repositories {
        libs(PrebuiltLibraries) {
            jniLib {
                headers.srcDir projectDir.absolutePath + "\\jni\\include"
                headers.srcDir projectDir.absolutePath + "\\jni\\include\\linux"
            }
            rf24 {
                headers.srcDir projectDir.absolutePath + "\\rf24\\RF24"
                headers.srcDir projectDir.absolutePath + "\\rf24\\RF24\\utility"
                headers.srcDir projectDir.absolutePath + "\\rf24\\RF24\\utility\\RPi"
                binaries.withType(SharedLibraryBinary) {
                    sharedLibraryFile = file( projectDir.absolutePath + "\\rf24\\librf24.so")
                    sharedLibraryLinkFile = file( projectDir.absolutePath + "\\rf24\\librf24.so")
                }
            }
        }
    }

    components {
        transmitter(NativeLibrarySpec) {
            targetPlatform "raspberry"
            sources {
                cpp.lib library: 'jniLib', linkage: 'api'
                cpp.lib library: 'rf24', linkage: 'api'
            }
        }
    }

}

推荐答案

请改用以下内容:

cpp.lib library: 'rf24', linkage: 'shared'

这会导致从libtransmissionlibrf24的传递依赖.

This induces a transitive dependency from libtransmission to librf24.

但是,并排放置文件还不够.您应该在运行时设置LD_LIBRARY_PATH,或者使用相对的RPATH编译libtransmission.

It is not enough to put the files side by side to be found, however. You should either set LD_LIBRARY_PATH at runtime or compile libtransmission with a relative RPATH .

这篇关于Gradle cpp插件未链接共享库的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆