我不明白为什么当-L已经告诉共享库路径在哪里时,有必要使用LD_LIBRARY_PATH提供rpath或set env varible。
this answer说:-L告诉ld在链接时,哪里可以找到链接的库。
但是为什么同时相应的-rpath没有设置自动?为什么我们需要再次手动完成?
P.S:我想如果你有这个功能,那么可执行文件在其他环境中将毫无用处。但是如果是这样那么 ld 在链接期间实际上做了什么,或者为什么在某些其他环境中-rpath不同时需要给-L路径。
答案 0 :(得分:1)
它绝对不是链接器"的错误特征。
-L
(一个更旧的标志)只是告诉链接器在该目录中查找与任何后续-l
标志匹配的任何库,包括静态库/存档(记住,在以前的时代,这是唯一的类库。故意保留仅限链接时间标志;链接器的业务完成后,它没有任何效果。
-rpath
是一个完全不同的野兽。其目的是在可执行文件或共享/动态库中嵌入一个或多个路径的列表,以便在运行时在共享库中查找必要的符号时搜索动态库 em>(r
中的-rpath
)。
有很多情况需要-L
而不是-rpath
;特别是当一个人特别想要链接静态库而不是推迟到动态链接器时。在大多数平台上覆盖内置rpath
,即使用LD_PRELOAD
环境变量,这是相对微不足道的,有些人实际上认为这是一个安全问题。
或许可以看一下http://sta.li/faq针对动态链接的令人信服的案例。