2016-02-12 33 views
1

我是一名計算機科學專業的第一年級學生,其課程涉及(其中包括)Makefiles課程。對於我們的第一個任務,我們必須創建一個共享庫並鏈接它。具體的「無法打開共享目標文件」錯誤

我具有以下設置:

  • 的文件夾hw1包含的文件夾和applib
  • Inside lib是一個名爲libmine.so的文件,我想鏈接到的庫。
  • Inside app,有兩個文件:test.cppMakefile。前者使用libmine庫。

Makefile如下(文件本身,壓痕等正確的):

all: test 

test: test.cpp 
     g++ -Wall -o test -L../lib -I../lib/include test.cpp -lmine 

然而,當運行test,我得到了臭名昭著的`libmine.so:無法打開共享對象文件'錯誤。

我相信這跟出口LD_LIBRARY_PATH有關。我試過這樣做(export LD_LIBRARY_PATH=$[very long relative path to the lib folder]),但我想在我的Makefile中這樣做。另外,我不希望路徑是相對的,因爲我的教師應該能夠在將文件發送給他時打開文件(所以我認爲它應該是類似於../lib/libmine.so)。

我查看了各種StackOverflow帖子,如this one,但似乎沒有人回答這個具體問題(要麼是不同的設置,要麼解決方案根本不起作用)。順便說一句:將export LD_LIBRARY_PATH=../libtest: test.cpp之下,並且g++命令之前沒有做任何事情。

任何幫助是非常讚賞:)

+0

只要是明確的,那就是不完整的錯誤消息,當您嘗試執行'test',而不是當你執行make出現的錯誤信息和*構建*' test'。那是對的嗎?你是否通過不同的方式獲得'test'來運行,例如通過在當前目錄中有'libmine.so'? – Beta

+0

是的,這是正確的。問題是在* runtime *找不到庫。 – limitIntegral314

回答

1

運行測試時,我得到了臭名昭著的`libmine.so:無法打開共享對象文件」的錯誤。

發生這種情況,因爲-L../lib參數告訴靜態鏈接程序到哪裏找到庫,但它並沒有告訴任何內容到動態連接器(又名裝載機),而問題是後者找不到此庫。

要解決這個問題,您可以使用LD_LIBRARY_PATH,但這通常是不明智的。

你想要的是一種叫RPATHRUNPATH(假設你是一個Linux或者類似的系統):

g++ -Wall -o test -L../lib -I../lib/include test.cpp -Wl,-rpath=../lib -lmine 

此外,我不想路徑是相對的,因爲我的teachter應該能夠打開該文件時,我把它送給他

是你的老師要運行的相同系統上的二進制,或者在不同的一個?如果是前者,你可以這樣做:

g++ -Wall -o test -L../lib -I../lib/include test.cpp -Wl,-rpath=/full/path/to/hw1/lib -lmine 

如果是後者,/full/path/to/hw1/lib可能會或可能不會提供你的老師的計算機上,你需要考慮什麼你要送他。

通常的辦法來解決,這是打包兩個應用程序和庫到一個tar文件:

tar cvf to-send.tar app/test lib/libmine.so 

老師可以再提取您的tar文件到任意目錄的部分,並嘗試運行它。要做到這一點,無論應用程序在哪裏結束,都需要與應用程序相關的RPATH。爲了實現這一目標,你想:

g++ -Wall -o test -L../lib -I../lib/include test.cpp -Wl,-rpath='$ORIGIN/../lib' -lmine 
+0

你,先生,是我的英雄。現在一切正常。唯一的是我寫了'-Wl,-rpath ='../lib'',所以沒有'$ ORIGIN'(因爲這沒有用)。非常感謝。 – limitIntegral314

相關問題