2016-11-22 25 views
0

我正在嘗試在Ubuntu的jni程序中使用libjpeg。我用g ++編譯我的C++代碼,並將libjpeg添加爲庫。我試圖鏈接共享版本和靜態版本,但他們都導致Java中的「未定義符號:jpeg_std_error」錯誤(而我的c + +代碼工作正常)。我確實使用了「extern」C「」作爲libjpeg頭文件。將libjpeg庫鏈接到共享庫,並且libjpeg在運行時未定義

這裏是我的靜態libjpeg.a(libjpeg的建成的libjpeg渦輪的一部分,並改名爲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的渦輪增壓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

奇怪的是,它不適用於庫的靜態版本,因爲那樣就不應該有一個額外的鏈接jpeg庫。您可以嘗試幾個選項:

  • 指定-Wl,--no-undefined打印爲未定義的引用錯誤的。所以(默認情況下,當共享庫已解析的符號鏈接不會失敗)
  • 嘗試ldd <sharedlib>看到未解決的依賴
  • 共享庫鏈接,嘗試添加RPATH:-Wl,-rpath,/path/to/jpeglib_so_dir - 此插入路徑共享庫裏面的libjpeg.so,以便它可以在不LDD路徑是
+0

感謝解決!我試圖添加標誌,並發現靜態庫沒有鏈接。不知何故,g ++不喜歡我的標誌順序,該行可能會被忽略。 –