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

3
我正在外部开发一些使用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找到具有这些错误的库,并手动将它们附加到库列表中(使它们在库列表中出现多次)。


你是在问为什么你的ld实现不接受--start-group吗?还是什么问题? - Lightness Races in Orbit
很明显它不支持它(手册没有提到等等),所以我正在寻找更好的方法来编译它,而不需要使用hack。例如,另一种链接器实现。但不能使用gold,因为它只支持ELF。 - Steven Lu
好的,那就更清楚了;也许你可以在问题中进一步澄清一下?无论如何,我至少可以证实你的发现,即Mac OSX的ld实现不支持--start-group - Lightness Races in Orbit
2个回答

6

以下是我使用LLVM/Clang库时,3.5版本的正确顺序:

    "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中提取链接顺序? - merito

0

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


“--start-group”和“--end-group”在OSX上不受支持,因此对它们无效。 - David Given
OSX提供了gcc 2.x的兼容性。由于某些原因,他们没有更新到最新的gcc功能。因此,这也取决于您使用的gcc版本。我正在使用gcc 4.8 - Jesse Chisholm
“--start-group” 是一个链接器选项。问题是如何在 macOS 上使用该标志,答案是安装 GNU ld。 - Clément

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接