OS X 上的链接器 (ld):如何使用 -wl,--start-group(和 --end-group)

linker (ld) on OS X: How to use -Wl,--start-group (and --end-group)?

本文关键字:-wl 何使用 --start-group --end-group 链接 OS ld      更新时间:2023-10-16

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

链接失败如下:

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

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

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

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本身的make文件中提取它,或者类似的东西。但是,Clang 列表非常小,因此根据 LLVM 顺序确定它非常容易,并且 Clang 必须在 LLVM 之前。我不知道 libclang 在这个列表中的位置,因为我不使用它,但我猜它应该排在第一位。

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

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

clanggcc命令行选项包括:

-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.8gcc 7.0。我不确定它们是何时首次添加到 gcc 的。