Make如何优先读取自定义-L路径并忽略pkg-config提供的库搜索路径
强制自定义库路径优先检索的解决方案
1. 调整链接参数顺序(最常用)
ld 会按照 -L 参数出现的从左到右顺序检索库文件,你之前的 -L${libdir}/libs 大概率是被追加到了系统 -L 参数(比如 -L/usr/local/lib)的后面,才会优先匹配到系统路径的库。
直接在执行 make 时强制将自定义路径放在 LDFLAGS 的最开头即可:
make LDFLAGS="-L${libdir}/libs ${LDFLAGS}"
如果是 macOS 环境,还可以额外加参数让链接器优先匹配静态库,避免先找到系统的动态库:
make LDFLAGS="-L${libdir}/libs -Wl,-search_paths_first ${LDFLAGS}"
如果想完全规避路径检索问题,可以直接写静态库的完整路径替换 -lxxx 写法,比如把 -lcrypto 换成 ${libdir}/libs/libcrypto.a,100%不会链接到错误的库。
2. 修正 pkg-config 的检索逻辑
绝大多数 Makefile 里的系统路径参数都是调用 pkg-config 自动生成的,pkg-config 默认会优先读取系统路径下的 .pc 配置文件,返回系统库的路径。
如果你的自定义依赖编译时生成了对应的 .pc 文件,把存放 .pc 文件的目录加到 PKG_CONFIG_PATH 最前面即可:
# 替换成你自己编译的依赖的.pc文件存放路径,一般是${libdir}/pkgconfig export PKG_CONFIG_PATH="${libdir}/pkgconfig:${PKG_CONFIG_PATH}" make
如果不需要 pkg-config 输出,也可以直接覆盖 Makefile 中对应依赖的变量,比如依赖是 libpng 的场景:
make LIBPNG_LIBS="-L${libdir}/libs -lpng" LIBPNG_CFLAGS="-I${libdir}/include"
3. 强制屏蔽系统默认检索路径(极端场景适用)
如果以上方法都不生效,可以给 ld 加参数完全禁用默认的系统库检索路径,只扫描你指定的目录:
make LDFLAGS="-nostdlib -L${libdir}/libs -lc ${LDFLAGS}"
注意-nostdlib会同时屏蔽C标准库的检索,需要手动补充-lc等标准库链接参数,对编译参数不熟悉不建议使用。
内容的提问来源于stack exchange,提问作者user2161301
相关产品推荐
相关产品推荐

