将libjpeg库链接到共享库,并且在运行时未定义libjpeg

时间:2016-11-22 09:20:45

标签: c++ g++

我正在尝试在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库的大小都是常量。

1 个答案:

答案 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查看未解决的依赖项
  • 对于共享库链接,尝试添加RPATH:ldd <sharedlib> - 这将在共享库中插入libjpeg.so的路径,以便可以在不使用ldd路径的情况下解析它