M1 Mac编译phone_numbers库时遭遇ld链接错误求助
解决M1 Mac上编译phone_numbers库的链接断言错误
错误原因分析
你遇到的ld: Assertion failed: (counter() < 0xffff), function nextCounter, file ld.hpp, line 466错误,本质是链接器(ld64)处理的符号/原子数量超过了内部16位计数器的上限(65535)。结合你提到的ld进程内存占用高达150MB,大概率是**链接时优化(LTO)**触发了这个问题——LTO会在链接阶段展开大量代码并分析符号,导致链接器需要处理的原子数量暴增,超出计数器阈值。
解决方案
1. 禁用链接时优化(LTO)
链接命令中包含-lto_library参数,这是触发LTO的关键。你需要修改phone_numbers库的编译配置,移除LTO相关选项:
- 找到项目
c_src目录下的Makefile,删除或注释掉包含-lto_library的行,或者添加-no_lto参数到LDFLAGS中。 - 如果通过Mix编译,在项目
mix.exs中调整编译选项传递参数给Makefile:
再在def project do [ # ...其他配置 compilers: [:elixir_make] ++ Mix.compilers(), make_args: ["NO_LTO=1"] ] endc_src/Makefile中添加对应逻辑:ifneq ($(NO_LTO),) LDFLAGS += -no_lto endif
2. 重新编译libphonenumber并禁用LTO
虽然brew安装的libphonenumber测试通过,但可以尝试从源码编译时关闭LTO:
brew uninstall libphonenumber brew install libphonenumber --build-from-source --without-lto
手动编译时可添加-DCMAKE_INTERPROCEDURAL_OPTIMIZATION=OFF参数关闭LTO。
3. 升级Xcode/链接器
你当前使用的ld64版本为857.1(对应Xcode 14.3.1),后续Xcode版本可能修复了计数器上限问题。尝试升级到最新Xcode后重新编译。
4. 清理重复的链接器搜索路径
你的链接命令中重复添加了-L/opt/homebrew/lib和-L.,清理这些重复路径可减少链接器搜索开销:
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ld \ -demangle \ -dynamic \ -dylib \ -arch arm64 \ -flat_namespace \ -platform_version macos 13.0.0 13.3 \ -syslibroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk \ -undefined suppress \ -o /Users/michals/code/phone_numbers/priv/phone_number_util_nif.so \ -L/opt/homebrew/Cellar/libphonenumber/8.13.17/lib \ -L/Users/michals/.asdf/installs/erlang/25.0.2/lib/erl_interface-5.3/lib \ -L/opt/homebrew/lib \ -L/usr/local/lib \ -lc++ \ -lei \ -lphonenumber \ -lSystem /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/clang/14.0.3/lib/darwin/libclang_rt.osx.a \ /Users/michals/code/phone_numbers/c_src/phone_number_util_nif.o \ -v
内容的提问来源于stack exchange,提问作者Michał Szajbe
相关产品推荐
相关产品推荐

