【问题标题】:linker (ld) on OS X: How to use -Wl,--start-group (and --end-group)?OS X 上的链接器(ld):如何使用 -Wl、--start-group(和--end-group)?
【发布时间】:2015-03-16 13:16:27
【问题描述】:

我正在外部构建一些使用 libclang 静态库的项目。

链接失败如下:

ld: unknown option: --start-group
clang: error: linker command failed with exit code 1 (use -v to see invocation)

我需要使用它的原因是因为循环依赖(或者事实证明,我猜是因为不知道正确的库顺序)。

到目前为止,我不得不求助于将 -Wl,--{start,end}-group 从 makefile 中取出,查看未定义符号错误列表,找到带有 nm 的库,然后手动将它们附加到库列表中(这样它们在库列表中出现多次)。

【问题讨论】:

  • 您是否在问为什么您的ld 实现不接受--start-group?还是什么?
  • 好吧,它显然不支持它(手册页没有提到等),所以我正在寻找一种更好的方法来让它在没有黑客攻击的情况下进行编译。例如,另一种链接器实现。不能使用黄金,因为它只是 ELF。
  • 好吧,这更清楚了;也许你可以在你的问题中澄清一下?无论如何,我至少可以证实Mac OSX's ld implementation doesn't support --start-group 的发现。

标签: c++ macos clang ld


【解决方案1】:

3.5 的 LLVM/Clang 库(取自我自己使用它的项目)的正确顺序是:

    "clangFrontend",
    "clangSerialization",
    "clangDriver",
    "clangTooling",
    "clangCodeGen",
    "clangParse",
    "clangSema",
    "clangAnalysis",
    "clangRewriteFrontend",
    "clangRewrite",
    "clangEdit",
    "clangAST",
    "clangLex",
    "clangBasic",
    "LLVMLTO",
    "LLVMObjCARCOpts",
    "LLVMLinker",
    "LLVMipo",
    "LLVMVectorize",
    "LLVMBitWriter",
    "LLVMIRReader",
    "LLVMAsmParser",
    "LLVMR600CodeGen",
    "LLVMR600Desc",
    "LLVMR600Info",
    "LLVMR600AsmPrinter",
    "LLVMSystemZDisassembler",
    "LLVMSystemZCodeGen",
    "LLVMSystemZAsmParser",
    "LLVMSystemZDesc",
    "LLVMSystemZInfo",
    "LLVMSystemZAsmPrinter",
    "LLVMHexagonCodeGen",
    "LLVMHexagonAsmPrinter",
    "LLVMHexagonDesc",
    "LLVMHexagonInfo",
    "LLVMNVPTXCodeGen",
    "LLVMNVPTXDesc",
    "LLVMNVPTXInfo",
    "LLVMNVPTXAsmPrinter",
    "LLVMCppBackendCodeGen",
    "LLVMCppBackendInfo",
    "LLVMMSP430CodeGen",
    "LLVMMSP430Desc",
    "LLVMMSP430Info",
    "LLVMMSP430AsmPrinter",
    "LLVMXCoreDisassembler",
    "LLVMXCoreCodeGen",
    "LLVMXCoreDesc",
    "LLVMXCoreInfo",
    "LLVMXCoreAsmPrinter",
    "LLVMMipsDisassembler",
    "LLVMMipsCodeGen",
    "LLVMMipsAsmParser",
    "LLVMMipsDesc",
    "LLVMMipsInfo",
    "LLVMMipsAsmPrinter",
    "LLVMAArch64Disassembler",
    "LLVMAArch64CodeGen",
    "LLVMAArch64AsmParser",
    "LLVMAArch64Desc",
    "LLVMAArch64Info",
    "LLVMAArch64AsmPrinter",
    "LLVMAArch64Utils",
    "LLVMARMDisassembler",
    "LLVMARMCodeGen",
    "LLVMARMAsmParser",
    "LLVMARMDesc",
    "LLVMARMInfo",
    "LLVMARMAsmPrinter",
    "LLVMPowerPCDisassembler",
    "LLVMPowerPCCodeGen",
    "LLVMPowerPCAsmParser",
    "LLVMPowerPCDesc",
    "LLVMPowerPCInfo",
    "LLVMPowerPCAsmPrinter",
    "LLVMSparcDisassembler",
    "LLVMSparcCodeGen",
    "LLVMSparcAsmParser",
    "LLVMSparcDesc",
    "LLVMSparcInfo",
    "LLVMSparcAsmPrinter",
    "LLVMTableGen",
    "LLVMDebugInfo",
    "LLVMOption",
    "LLVMX86Disassembler",
    "LLVMX86AsmParser",
    "LLVMX86CodeGen",
    "LLVMSelectionDAG",
    "LLVMAsmPrinter",
    "LLVMX86Desc",
    "LLVMX86Info",
    "LLVMX86AsmPrinter",
    "LLVMX86Utils",
    "LLVMJIT",
    "LLVMLineEditor",
    "LLVMMCAnalysis",
    "LLVMMCDisassembler",
    "LLVMInstrumentation",
    "LLVMInterpreter",
    "LLVMCodeGen",
    "LLVMScalarOpts",
    "LLVMInstCombine",
    "LLVMTransformUtils",
    "LLVMipa",
    "LLVMAnalysis",
    "LLVMProfileData",
    "LLVMMCJIT",
    "LLVMTarget",
    "LLVMRuntimeDyld",
    "LLVMObject",
    "LLVMMCParser",
    "LLVMBitReader",
    "LLVMExecutionEngine",
    "LLVMMC",
    "LLVMCore",
    "LLVMSupport"

您不必自己确定顺序 - 使用 -llvm-config 获取 LLVM 顺序。 Clang 命令有点棘手——从内存中,您需要从用于构建 Clang 本身的 makefile 或类似的东西中提取它。但是,Clang 列表非常小,因此根据 LLVM 顺序确定它非常容易,并且 Clang 必须在 LLVM 之前。我不知道 libclang 在这个列表中的位置,因为我不使用它,但我猜它应该放在第一位。

【讨论】:

  • 请问您是如何从 makefile 中提取链接顺序的?
【解决方案2】:

@Puppy 接受的答案确实满足了 OP 的最终需求——如何以所需的链接顺序获取库。

但它没有回答 OP 的实际问题——如何使用 --start-group 和 --end-group。

clang 和 gcc 命令行选项是:

-Wl,--start-group
libs-in-the-order-you-need ...
-Wl,--end-group

您的里程可能因其他编译器而异。

更新(2019.07.11): David Given 指出 OSX 默认提供的 gcc 甚至不支持这些选项。

那是因为 OSX 只提供gcc 2.x 兼容性。 当我开始在我的项目中使用这些选项时,我正在使用gcc 4.8 和gcc 7.0。 我不确定它们是什么时候第一次添加到 gcc 中的。

【讨论】:

  • --start-group 和 --end-group 不受 OSX 支持,因此这对它们不起作用。
  • OSX 提供了gcc 2.x 兼容性。出于某种原因,他们懒得更新到最新的 gcc 功能。因此,也取决于您使用的 gcc 的 version。我使用的是gcc 4.8。
猜你喜欢
  • 1970-01-01
  • 2011-10-26
  • 2016-06-28
  • 2011-08-04
  • 1970-01-01
  • 2019-02-25
  • 2019-09-07
  • 2020-07-21
  • 2016-02-04
相关资源
最近更新 更多