我无法弄清楚为什么我的二进制文件没有链接到我写的 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 / dist / 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
答案 0 :(得分: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
时,执行运行时链接(无法找到所需的库)。
要使运行时链接成功,您需要告诉 runtime 链接器找到库的位置(-L...
标志仅指示 static 链接器找到图书馆)。您使用-Wl,-rpath=...
标志执行此操作:
LDLIBRARIES += -Wl,-rpath=${JRELIB}:${JRELIB}/server:${JRELIB}/xawt