(這個問題涉及 Java JNI,但我不認為問題實際上出在 JNI 或 Java 上)
我正在執行這個命令:
cc -shared -fpic -L. -lcpdf -I$JAVA_HOME/include I$JAVA_HOME/include/linux jcpdfwrapper.c -o libjcpdf.so
也就是說我正在構建libjcpdf.so需要函式的共享庫libcpdf.so,所以應該依賴它。
在 Windows (MinGW) 和 MacOS 上,新的共享庫 (jcpdf) 清楚地鏈接到給定的 (cpdf):
WINDOWS:
$ ldd jcpdf.dll
ntdll.dll => /cygdrive/c/WINDOWS/SYSTEM32/ntdll.dll (0x7ffe875f0000)
KERNEL32.DLL => /cygdrive/c/WINDOWS/System32/KERNEL32.DLL (0x7ffe86400000)
KERNELBASE.dll => /cygdrive/c/WINDOWS/System32/KERNELBASE.dll (0x7ffe851f0000)
msvcrt.dll => /cygdrive/c/WINDOWS/System32/msvcrt.dll (0x7ffe87120000)
libcpdf.dll => /home/JohnWhitington/jcpdf/libcpdf.dll (0x3743f0000)
WS2_32.dll => /cygdrive/c/WINDOWS/System32/WS2_32.dll (0x7ffe870b0000)
RPCRT4.dll => /cygdrive/c/WINDOWS/System32/RPCRT4.dll (0x7ffe87480000)
VERSION.dll => /cygdrive/c/WINDOWS/SYSTEM32/VERSION.dll (0x7ffe7d270000)
OS X:
$ otool -L libjcpdf.dylib
libjcpdf.dylib:
libjcpdf.dylib (compatibility version 0.0.0, current version 0.0.0)
libcpdf.so (compatibility version 0.0.0, current version 0.0.0)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1311.100.3)
然而,在 Linux 上,我們在 libjcpdf.so 中沒有對 libcpdf.so 的參考:
$ ldd libjcpdf.so
linux-vds0,30,1 => (60x00007fc40b13000)
libc.so,6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fc1fb2af000)
/lib64/ld-linux-x86-64.so.2 (0x00007fe1fba8f000)
所以發生的情況是,雖然從主 Java 程式System.LoadLibrary("jcpdf")成功,但任何使用該庫的嘗試都會給出:
java: symbol lookup error: /home/john/jcpdf/libjcpdf.so: undefined symbol: cpdf_startup
整個程式在 MacOS 和 Windows 上運行良好。
我怎么知道ccmakelibjcpdf.so實際上依賴于libcpdf.so?
uj5u.com熱心網友回復:
您的版本cc(或它使用的鏈接編輯器)似乎默認為-Wl,--as-neeeded. 在這種情況下,命令列順序很重要。如果-lcpdf先出現,則還沒有對其符號的參考,因此不會創建依賴項。-l爭論應該排在最后:
cc -shared -fpic -I$JAVA_HOME/include I$JAVA_HOME/include/linux jcpdfwrapper.c -o libjcpdf.so -L. -lcpdf
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/457907.html
