【问题标题】:Can't link on Linux even with archive groups即使使用存档组也无法在 Linux 上链接
【发布时间】:2015-11-13 22:14:18
【问题描述】:

我正在努力在 Linux 上链接我的程序。我已经放弃并破解了我用来使用存档组的 Makefile。但是,我仍然有一堆未定义的对我知道我导出的东西的引用——在 Windows 上构建成功,如果我从源代码构建 LLVM。

完整的命令是

g++ -o ../Build/x64/Release/SemanticTest -s -m64 -L/usr/lib64 -L/usr/lib/llvm-3.6/lib -L/opt/wide/boost_1_59_0/stage/lib -L../Build/x64/Release   -Wl,--start-group ../Obj/SemanticTest/x64/Release/test.o ../Obj/SemanticTest/x64/Release/main.o  -lUtil -lSemantic -lParser -lLexer -lm -lstdc++ -lclangFrontend -lclangSerialization -lclangDriver -lclangTooling -lclangCodeGen -lclangParse -lclangSema -lclangAnalysis -lclangRewriteFrontend -lclangRewrite -lclangEdit -lclangAST -lclangLex -lclangBasic -lLLVMLTO -lLLVMObjCARCOpts -lLLVMLinker -lLLVMBitWriter -lLLVMIRReader -lLLVMAsmParser -lLLVMR600CodeGen -lLLVMipo -lLLVMVectorize -lLLVMR600AsmParser -lLLVMR600Desc -lLLVMR600Info -lLLVMR600AsmPrinter -lLLVMSystemZDisassembler -lLLVMSystemZCodeGen -lLLVMSystemZAsmParser -lLLVMSystemZDesc -lLLVMSystemZInfo -lLLVMSystemZAsmPrinter -lLLVMHexagonDisassembler -lLLVMHexagonCodeGen -lLLVMHexagonDesc -lLLVMHexagonInfo -lLLVMNVPTXCodeGen -lLLVMNVPTXDesc -lLLVMNVPTXInfo -lLLVMNVPTXAsmPrinter -lLLVMCppBackendCodeGen -lLLVMCppBackendInfo -lLLVMMSP430CodeGen -lLLVMMSP430Desc -lLLVMMSP430Info -lLLVMMSP430AsmPrinter -lLLVMXCoreDisassembler -lLLVMXCoreCodeGen -lLLVMXCoreDesc -lLLVMXCoreInfo -lLLVMXCoreAsmPrinter -lLLVMMipsDisassembler -lLLVMMipsCodeGen -lLLVMMipsAsmParser -lLLVMMipsDesc -lLLVMMipsInfo -lLLVMMipsAsmPrinter -lLLVMAArch64Disassembler -lLLVMAArch64CodeGen -lLLVMAArch64AsmParser -lLLVMAArch64Desc -lLLVMAArch64Info -lLLVMAArch64AsmPrinter -lLLVMAArch64Utils -lLLVMARMDisassembler -lLLVMARMCodeGen -lLLVMARMAsmParser -lLLVMARMDesc -lLLVMARMInfo -lLLVMARMAsmPrinter -lLLVMPowerPCDisassembler -lLLVMPowerPCCodeGen -lLLVMPowerPCAsmParser -lLLVMPowerPCDesc -lLLVMPowerPCInfo -lLLVMPowerPCAsmPrinter -lLLVMSparcDisassembler -lLLVMSparcCodeGen -lLLVMSparcAsmParser -lLLVMSparcDesc -lLLVMSparcInfo -lLLVMSparcAsmPrinter -lLLVMTableGen -lLLVMDebugInfo -lLLVMOption -lLLVMX86Disassembler -lLLVMX86AsmParser -lLLVMX86CodeGen -lLLVMSelectionDAG -lLLVMAsmPrinter -lLLVMX86Desc -lLLVMMCDisassembler -lLLVMX86Info -lLLVMX86AsmPrinter -lLLVMX86Utils -lLLVMMCJIT -lLLVMLineEditor -lLLVMInstrumentation -lLLVMInterpreter -lLLVMExecutionEngine -lLLVMRuntimeDyld -lLLVMCodeGen -lLLVMScalarOpts -lLLVMProfileData -lLLVMObject -lLLVMMCParser -lLLVMBitReader -lLLVMInstCombine -lLLVMTransformUtils -lLLVMipa -lLLVMAnalysis -lLLVMTarget -lLLVMMC -lLLVMCore -lLLVMSupport -ldl -lpthread -lncurses -lboost_program_options -larchive -lz -Wl,--end-group

如何说服 ld 真正找到我导出的内容?

【问题讨论】:

  • 嗯,这在很大程度上取决于您究竟遇到了什么错误。链接器组用于处理循环引用,无需在其中包含 pthread、dl、ncurses 等库——它们之间绝对没有任何引用。未解析的符号位于哪个或哪些库中?
  • 嗯,不太可能。这些“链接器组”用于处理库之间的循环引用,因此至少在理论上应该消除这个问题。我敢打赌错误的名字修饰。
  • 涉及的库是前四个——Util、Semantic、Parser、Lexer。例如Parser 无法在 Lexer 中找到标记定义。它们都是作为同一个项目的一部分编译的,因此不确定名称修改可能是什么原因。
  • 我可以发布确切的错误,但我怀疑它是否有用,它主要是它找不到的东西的确切完整模板类型。

标签: linux gcc ld


【解决方案1】:

这与不兼容的 ABI 有关。我有旧的缓存二进制文件,我需要清除它们。我用 Clang 3.6 重建了我自己的工作,现在我几乎可以链接了。在我的代码和我使用的库之间只剩下使用 std::string 的函数,即 LLVM&Clang 和 Boost。

最终,我认为这可能是由于我尝试使用相同的构建脚本同时使用 Precise 和 Willy 所做的所有事情,例如安装 Clang 3.6 并尝试将其用作编译器。干净安装 Willy 做显而易见的事情就可以了。

【讨论】:

    猜你喜欢
    • 2013-07-23
    • 1970-01-01
    • 1970-01-01
    • 2011-11-19
    • 1970-01-01
    • 2021-04-04
    • 2020-08-15
    • 2013-01-16
    • 2022-07-21
    相关资源
    最近更新 更多