2017-08-06 18 views
1

我從ld得到了一些關於找不到的庫的警告,但據我所知它應該找到他們。例如:「libb」需要GCC/ld警告「liba」,找不到,但是rpath的一部分

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

這發生在我鏈接可執行build/unit_test,其包括build/libleaf_lang.so,作爲命令行(1)的一部分。鏈接將rpath=$ORIGIN添加到可執行文件和所有庫,包括庫build/libleaf_lang.so。如果我做LDD上build/libleaf_lang.so它能夠找到庫中的問題:

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

這似乎表明所需的庫中找到。那麼爲什麼我會收到警告?

請注意,這似乎只發生在我使用共享庫的路徑build/libleaf_lang.so進行鏈接時。如果我按照名稱-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

+0

也許嘗試'-rpath = \「$ ORIGIN \」'... –

+0

@ l'L l rpath位正在工作。生成的庫/可執行文件已正確設置。該命令是從構建過程輸出中複製的,而不是直接給予bash的。 –

+0

您使用的是哪個平臺/操作系統? –

回答

1
+0

我想就是這樣,因爲我使用的是2.26.1。我想知道爲什麼這只是在這種情況下的警告。 –

+0

在大多數情況下,在爲動態鏈接準備對象時,「ld」實際上並不需要訪問共享對象,這就是爲什麼硬錯誤可能被視爲過度。 (傳統上,ELF鏈接不會執行很多錯誤檢查。) –