不能 link on Linux 即使有存档组

Can't link on Linux even with archive groups

我正在努力 link 我在 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 真正找到我导出的东西?

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

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