OS X 上的链接器 (ld):如何使用 -wl,--start-group(和 --end-group)
linker (ld) on OS X: How to use -Wl,--start-group (and --end-group)?
我正在外部构建一些使用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
。
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 的。
相关文章:
- 如何创建一个CMake变量,除非显式重写,否则使用默认值
- C++:TypeDef使用元组
- 使用std::multimap迭代器创建std::list
- 从不同线程使用int64的不同字节安全吗
- 比较并显示使用最小值(a,b)和最大值(a、b)升序排列的4个数字
- 为什么在全局范围内使用"extern int a"似乎不行?
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 使用C++库在Android项目中修改gradle中的cmake参数,用于插入指令的测试
- 如何使用Google Mock来模拟gettimeofday()
- 如何使用默认参数等选择模板专业化
- 为什么使用 "this" 指针调用派生成员函数?
- 使用新行和不使用新行读取文件
- 使用 LLVM 的 libc++ 时,__1 符号从何而来?
- 根据需要强制使用 -Wl,-- 与共享库链接(当仅提供模板时)
- 在std::cout之后使用std::cin时,换行符从何而来
- 链接错误 OpenCV 仅在使用 -wl,-rpath,/usr/local/MATLAB/R2014b/bin/gln
- OS X 上的链接器 (ld):如何使用 -wl,--start-group(和 --end-group)
- 为什么以及在何处在C++中使用引用和指针
- 基例如何影响使用递归函数的哪些行
- 使用g++编译多线程代码(-Wl,--no根据需要不工作)