2012-06-13 76 views
2

我看過很多在SO中發佈這個問題。我已經閱讀了這些帖子並嘗試了建議的方法,但不幸的是我無法幫助我解決問題。Ubuntu中的java.lang.UnsatisfiedLinkError

這裏是我的問題:

public class runme { 
    static { 
    System.loadLibrary("example"); 
    } 

    public static void main(String argv[]) { 
    System.out.println(example.fact(4)); 


    } 
} 

錯誤:

[email protected]:~/Desktop/swigtest/new$ java runme 
Exception in thread "main" java.lang.UnsatisfiedLinkError: no example in java.library.path 
    at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1681) 
    at java.lang.Runtime.loadLibrary0(Runtime.java:840) 
    at java.lang.System.loadLibrary(System.java:1047) 
    at runme.<clinit>(runme.java:5) 
    Could not find the main class: runme. Program will exit. 

的例子圖書館是爲runme.java相同的路徑。爲什麼我會得到這個錯誤呢?我正在從Ubuntu OS開始工作。

任何幫助,這將有助於我解決這個問題,非常感謝。

編輯:

我重視我的文件here

+2

我刪除的C標記,因爲它似乎並不相關。 – AusCBloke

+1

@maba他可能已經剝離了代碼,僅向我們展示相關部分(庫加載)。 –

+0

@maba您的評論不具建設性。 – user845279

回答

1

即使docs在庫名映射到實際系統庫的方法取決於系統,在我的經驗loadLibrary的相對路徑是指工作目錄(在這之後的檢查所有其他定義的和系統相關的路徑)。

如果對工作目錄不確定,請檢查System.getProperty("user.dir")返回的內容。

+0

System.getProperty(「user.dir」)返回我的類文件和庫存在的路徑 – user1400538

+0

該目錄中確實有一個名爲'example'的文件嗎?任何可能是'example.so'的機會 - 通常動態庫在Linux中都是這樣命名的? –

+0

是的,例子就在那裏。它是一個可執行文件。我的代碼是[這裏](https://docs.google.com/open?id=0B-2RQZcQbc7NSzdGZVN3QU1kZlU) – user1400538

1

您必須設置java.library.path屬性,包括庫的路徑。或者將其複製到路徑中已有的位置。

+0

我已經設置了使用export PATH =/path/to/my/libs:$ PATH命令,並確認此庫是否位於使用echo $ PATH命令的路徑中。它仍然給我這個問題。 – user1400538

+1

在ubuntu上,java.library.path基於LD_LIBRARY_PATH,而不是PATH。 – technomage

0

我遇到了在Ubuntu這個問題,並用一個bat文件

export LD_LIBRARY_PATH=$PWD/lib/linux32 
./fiji-linux 
解決它

這需要設置的目的是LD_LIBRARY_PATH,我將其與另外/ lib中/ linux32鏡像的設置到本地目錄。下一行運行我的程序。

+0

這樣? 'export LD_LIBRARY_PATH =/home/anu/Desktop/swigtest/new/lib/linux32'。它不這樣也工作! – user1400538

+0

我確定您知道您必須將您的庫放入名爲lib/linux32的子目錄中。我們選擇這樣做,因爲它可以爲linux64,win32等提供不同的庫。它對我來說工作得非常好。我的fiji-linux處於$ PWD的級別,即高於 –

+0

的2個級別。我還應該提到./fiji-linux很重要,因爲在bat文件結束時導出超出了範圍。 –

1

嘗試運行您的程序是這樣的:

$> java -Djava.library.path=/path/to/my/libs runme 

/path/to/my/libs應改爲,你真有你的.so文件(S)。


編輯

我在我的Ubuntu虛擬機上安裝openjdk-6-jdk上看到的包含文件。

試試這個讓你libexample.so

$> gcc -fPIC -g -c -Wall example_wrap.c -I/usr/lib/jvm/java-6-openjdk/include -I/usr/lib/jvm/java-6-openjdk/include/linux 
$> gcc -shared -o libexample.so example_wrap.o 

然後檢查該文件已創建...

現在,你只需要調用

$> java runme 

-Djava.library.path如果.so文件在工作目錄是沒有必要的。

+0

'anu @ anu-desktop:〜/ Desktop/swigtest/new $ java -Djava.library.path =/home/anu/Desktop/swigtest/new runme 線程「main」中的異常java.lang.UnsatisfiedLinkError:no example在的java.library.path \t在java.lang.ClassLoader.loadLibrary(ClassLoader.java:1681) \t在java.lang.Runtime.loadLibrary0(Runtime.java:840) \t在java.lang.System.loadLibrary (System.java:1047) \t at runme。 (runme.java:5) 找不到主要類:runme。程序將會退出。 anu @ anu-desktop:〜/ Desktop/swigtest/new $ '爲什麼會發生這種情況? – user1400538

+0

根據另一個答案,你在這裏有你的lib文件'/ home/anu/Desktop/swigtest/new/lib/linux32'。所以這就是你應該添加到'-Djava.library.path'中的東西。嘗試找到'libexample.so'並指向那裏。 – maba

+0

這是我的路徑/ home/anu/Desktop/swigtest/new。由於Ilan Tal告訴「添加了/ lib/linux32」,我只是將它添加到我的路徑來檢查他的建議 – user1400538

0

您需要添加/追加路徑共享庫的LD_LIBRARY_PATH,如:

LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/path_to_folder_where_your_shared_library_is 
相關問題