【问题标题】:GNUMake link step not work for certain librariesGNUMake 链接步骤不适用于某些库
【发布时间】:2016-06-19 16:29:07
【问题描述】:

我不明白为什么我的二进制文件没有与我编写的 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

【问题讨论】:

    标签: linker gnu-make gnu ld


    【解决方案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
    

    【讨论】:

    • 是的,问题实际上出在 RPATH 上,非常感谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-16
    • 1970-01-01
    • 2017-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多