2016-03-06 70 views
0

我不明白爲什麼我的二進制文件沒有鏈接到我寫的GNUMake文件中的某些庫。我有:GNUMake鏈接步驟不適用於某些庫

LDLIBRARIES += -L/ms/dist/msjava/PROJ/sunjdk/1.6.0_31/.exec/amd64.linux.2.4.glibc.2.3/jre/lib/amd64/ 
LDLIBRARIES += -L/ms/dist/msjava/PROJ/sunjdk/1.6.0_31/.exec/amd64.linux.2.4.glibc.2.3/jre/lib/amd64/sever 
LDLIBRARIES += -L/ms/dist/msjava/PROJ/sunjdk/1.6.0_31/.exec/amd64.linux.2.4.glibc.2.3/jre/lib/amd64/xawt 
LDLIBRARIES += -lmlib_image -lfontmanager -lawt -lmawt 
LDLIBRARIES += -ljvm -lverify -lzip -ljava` 

二進制我得到的,當我在其上運行的LDD命令我沒有看到上述被正確鏈接的文件,即使他們是在以上/ MS指定的路徑/距離/ MSJAVA /PROJ/sunjdk/1.6.0_31/.exec/amd64.linux.2.4.glibc.2.3/jre/lib/amd64/ 上生成的二進制文件的LDD命令給我:

libmlib_image.so => not found 
libfontmanager.so => not found 
libawt.so => not found 
libjvm.so => not found 
libverify.so =t found 
libzip.so =t found 
libjava.so => not found 

回答

1

有你的幾個問題Makefile。第一個是你重複自己(很多)。在編程中,這通常被認爲是bad practice

您可以使用例如

JRELIB = /ms/dist/msjava/PROJ/sunjdk/1.6.0_31/.exec/amd64.linux.2.4.glibc.2.3/jre/lib/amd64 
LDLIBRARIES += -L${JRELIB} -L${JRELIB}/server -L${JRELIB}/xawt 

第二個問題是,你不明白靜態鏈接和運行時鏈接之間的區別。

當您運行make時,將執行靜態(建立時間)鏈接,其中成功

運行ldd時,執行運行時鏈接(無法找到所需的庫)。

爲了使運行時鏈接成功,你需要告訴運行時連接器,其中庫被發現(在-L...標誌只告訴靜態鏈接程序到哪裏找到庫)。你用-Wl,-rpath=...這麼做標誌:

LDLIBRARIES += -Wl,-rpath=${JRELIB}:${JRELIB}/server:${JRELIB}/xawt 
+0

是的,問題實際上與RPATH非常感謝。 –