GNUMake链接步骤对某些库不起作用

时间:2016-03-06 00:00:11

标签: linker gnu-make gnu ld

我无法弄清楚为什么我的二进制文件没有链接到我写的 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

1 个答案:

答案 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