2012-04-02 120 views
3

我試圖將我的程序鏈接到共享庫。我使用makefile來編譯。它看起來像這樣:`共享庫,makefile。庫路徑

make: sms_out.cpp SMSDispatch.cpp SMSDispatch.h 
     g++ -c -fPIC SMSDispatch.cpp -o SMSDispatch.o 
     g++ -shared SMSDispatch.o -o libSMSDispatch.so 
`  g++ sms_out.cpp -L. -lSMSDispatch -o sms_out 

,如果我在命令窗口中運行該程序,它工作正常:

LD_LIBRARY_PATH="." ./sms_out 

但我只想與./sms_out運行它,有人可以幫我嗎? 試圖將export LD_LIBRARY_PATH=.添加到生成文件,但沒有工作,只是當我嘗試運行程序時,收到錯誤「加載共享庫時出錯:libSMSDispatch.so:無法打開共享目標文件:沒有這樣的文件或目錄」。

回答

2

加入其中.so文件所在的目錄LD_LIBRARY_PATH

$ export LD_LIBRARY_PATH=/dir/containing/sharedobject 

可能對你有用的實用程序是ldd,打印共享庫的依賴關係。例如:

 
    $ ldd /bin/ls 
     linux-vdso.so.1 => (0x00007fff819ff000) 
     librt.so.1 => /lib64/librt.so.1 (0x00007fc0d3f67000) 
     libselinux.so.1 => /lib64/libselinux.so.1 (0x00007fc0d3d4a000) 
     libacl.so.1 => /lib64/libacl.so.1 (0x00007fc0d3b42000) 
     libc.so.6 => /lib64/libc.so.6 (0x00007fc0d37e9000) 
     libpthread.so.0 => /lib64/libpthread.so.0 (0x00007fc0d35cd000) 
     /lib64/ld-linux-x86-64.so.2 (0x00007fc0d4170000) 
     libdl.so.2 => /lib64/libdl.so.2 (0x00007fc0d33c9000) 
     libattr.so.1 => /lib64/libattr.so.1 (0x00007fc0d31c4000) 

如果共享對象不是可定位的字符串未找到,或相似的,顯示,而不是所使用的路徑的共享對象。

+0

我想告訴正在運行的程序庫,它正在查找的庫位於Im文件夾中,也是「。」,它可以很好地與LD_LIBRARY_PATH =工作。 。/ sms_out',或者在運行程序之前使用'export LD_LIBRARY_PATH = .'。但是,如果我嘗試將'export LD_LIBRARY_PATH = .'添加到makefile,那麼在調用makefile之後嘗試運行該程序時,它並不起作用。你知道爲什麼嗎? – Veronic 2012-04-02 12:41:44

+0

運行makefile後檢查'LD_LIBRARY_PATH'的值:不能像'export'這樣的變量,'export'只會影響運行腳本的進程。我不知道從makefile修改環境變量的方法(這不是說一個機制不存在,我只是不知道其中的一個)。如果你有一個包含'export'語句的腳本,你可以通過調用它來改變環境,如:'$。 。/ myexport.sh' – hmjd 2012-04-02 12:45:37

+0

好的,但我可以把導出語句放入我想運行的文件(sms_out.cpp)嗎?順便說一句,運行makefile後LD_LIBRARY_PATH的值爲空白,在我運行之前我認爲它是空白的 – Veronic 2012-04-02 13:01:38

3

另一個選項 - 爲鏈接器提供-rpath選項以通知您的二進制文件在哪裏搜索動態對象。

g++ -Wl,-rpath=<path to .so> -o <your binary here> <cpp file name>.cpp