Gcc/ld 警告 "liba" "libb" 需要,未找到,但是 rpath 的一部分

Gcc/ld warning "liba" needed by "libb", not found, yet part of rpath

我从 ld 那里收到一些关于未找到库的警告,但据我所知它应该能找到它们。例如:

/usr/bin/ld: warning: libleaf_util.so, needed by build/libleaf_lang.so, not found (try using -rpath or -rpath-link)

当我 link 包含 build/libleaf_lang.so 的可执行文件 build/unit_test 作为命令行 (1) 的一部分时,就会发生这种情况。 linking 正在将 rpath=$ORIGIN 添加到可执行文件和所有库,包括库 build/libleaf_lang.so。如果我在 build/libleaf_lang.so 上执行 ldd,它能够找到有问题的库:

libleaf_util.so => /home/src/leaf/misc/build/libleaf_util.so (0x00007fd7c2f90000)

这似乎表明找到了所需的库。那么为什么我会收到警告?

请注意,这似乎仅在我 link 使用共享库路径 build/libleaf_lang.so 时才会发生。如果我按名称 link -lleaf_lang,就像我对另一个可执行文件所做的那样,我不会收到警告。


(1) g++ -o build/unit_test -z origin -Wl,-rpath=$ORIGIN build/boost_test_main.o build/test/expr_conversion_test.o build/test/statement_test.o build/test/expr_type_test.o build/test/full_type_test.o build/test/gmp_test.o build/test/intr_type_parse_test.o build/test/lambda_test.o build/test/number_test.o build/test/object_holder_test.o build/test/parse_test.o build/test/scope_test.o build/test/source_test.o build/test/type_converter_cost.o build/test/type_converter_fixate.o build/test/type_converter_function_call.o build/test/type_converter_match_function.o build/test/type_converter_parameterize_type.o build/test/type_converter_test.o build/test/type_converter_unify.o build/test/type_identifier_constrain.o build/test/type_identifier_determine.o build/test/type_identifier_expand.o build/test/type_identifier_get_spec.o build/test/type_identifier_infer.o build/test/unicode_test.o build/libleaf_lang.so build/libleaf_parser.so build/libleaf_util.so build/libleaf_runner.so build/libleaf_ir.so build/libleaf_ir_llvm.so -Lbuild/build/lib -Lsrc/build/lib -L/usr/lib -Lbuild -Lsrc -L/opt/llvm/install/lib -L/usr/lib -lboost_unit_test_framework -lboost_program_options -lrt -ldl -lboost_regex -lLLVM-3.8 -lgmp -lgmpxx -lboost_filesystem -lboost_system

来自 binutils 的旧版本 ld 忽略了 RPATH 中的 $ORIGIN

此功能已添加到 binutils 2.28