我正在尝试在Ubuntu的jni程序中使用libjpeg。我使用g ++构建了我的c ++代码,并将libjpeg添加为库。我尝试了链接共享版本和静态版本,但它们都导致"未定义的符号:jpeg_std_error" Java中的错误(我的c ++代码工作正常)。我确实使用了" extern" C""对于libjpeg标题。
这是我的构建脚本,包含静态libjpeg.a(libjpeg是作为libjpeg-turbo的一部分构建的,并重命名为libjpeg151.a):
outputName=$libDir/libMyLib.so
g++ -DNDEBUG -O3 -march=native -mfpmath=sse -Ofast -flto -funroll-loops -fPIC -w -shared -o $outputName \
-I$jdkDir/include -I$jdkDir/include/linux -std=c++11 -pthread \
-L$libDir/SEngineLibraries/libjpegTurbo151Linux -ljpeg151 \
myCode.cpp
和共享版本(安装了libjpeg-turbo deb)
outputName=$libDir/libMyLib.so
g++ -DNDEBUG -O3 -march=native -mfpmath=sse -Ofast -flto -funroll-loops -fPIC -w -shared -o $outputName \
-I$jdkDir/include -I$jdkDir/include/linux -std=c++11 -pthread \
-ljpeg \
myCode.cpp
在我的Java代码中,当使用libjpeg运行代码时,会弹出以下错误:
symbol lookup error: /myDir/lib/libMyLib.so: undefined symbol: jpeg_std_error
这可能是可疑的:无论我是否在构建脚本中包含引用libjpeg的行,.so库的大小都是常量。
答案 0 :(得分:0)
奇怪的是,它不适用于库的静态版本,因为那时不应该有一个额外的链接jpeg库。您可以尝试的几个选项:
import codecs
fout = codecs.open("xxx.json", "w", "utf-8")
dict_to_json = json.dumps({'text':"中文"},ensure_ascii=False,indent=2)
fout.write(dict_to_json + '\n')
以打印.so中未定义引用的错误(默认情况下,当共享库具有未解析的符号时,链接器不会失败)-Wl,--no-undefined
查看未解决的依赖项ldd <sharedlib>
- 这将在共享库中插入libjpeg.so的路径,以便可以在不使用ldd路径的情况下解析它