Gradle cpp 插件没有 link 共享库
Gradle cpp plugin doesn't link shared library
我有一个 C++ 库可以用 RF24 收听广播。我使用带有 Java class 的 JNI 包装这个库。
我遇到的问题是 gradle 没有 link 共享库 librf24.so 进入我的库 libtransmitter.so.
当我在 libtransmitter.so 上调用 ldd 时,我有:
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 不存在
这是我的 gradle 配置:
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'
这会导致从 libtransmission
到 librf24
的传递依赖。
但是,将文件并排放置是不够的。您应该在运行时设置 LD_LIBRARY_PATH
或使用相对 RPATH
编译 libtransmission
.
我有一个 C++ 库可以用 RF24 收听广播。我使用带有 Java class 的 JNI 包装这个库。
我遇到的问题是 gradle 没有 link 共享库 librf24.so 进入我的库 libtransmitter.so.
当我在 libtransmitter.so 上调用 ldd 时,我有:
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 不存在
这是我的 gradle 配置:
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'
这会导致从 libtransmission
到 librf24
的传递依赖。
但是,将文件并排放置是不够的。您应该在运行时设置 LD_LIBRARY_PATH
或使用相对 RPATH
编译 libtransmission
.