clang交叉编译curl:如何通过configure与libtool传链接器标志?
Clang交叉编译curl(Autotools/Libtool)时-target标志被Libtool移除的问题与解决方法
问题背景
用Clang交叉编译基于Autotools和Libtool构建的curl库时,全程需要-target标志指定目标架构:
- 先设置
CC=clang,并把-target your-target-triple加入CFLAGS和LDFLAGS,执行./configure全程正常。 - 但执行
make时链接阶段失败,原因是Libtool会自动移除-target这类它不识别的标志。 - 试过Libtool官方提到的
-Xcompiler类标志——手动给Libtool命令加-XCClinker -target your-target-triple前缀可以正常链接,但如果把这个格式的标志放进LDFLAGS,configure的测试编译(不使用Libtool)会因为Clang命令行格式错误而失败。 - 目前临时解决方法是修改Libtool源码让它保留未知标志,但希望找到更合理的原生方案。
合理解决方法
方法1:区分configure测试与Libtool链接的标志
先给configure测试阶段设置原生的-target标志,生成Makefile后再修改LDFLAGS适配Libtool:
# 配置基础环境变量,供configure测试使用 export CC=clang export CFLAGS="-target your-target-triple" export LDFLAGS="-target your-target-triple" # 运行configure指定目标架构 ./configure --host=your-target-triple # 替换Makefile中的LDFLAGS,将-target包装为Libtool可识别的格式 sed -i 's/-target your-target-triple/-Wl,-XCClinker,-target,your-target-triple/' Makefile # 正常执行编译 make
方法2:通过configure参数传递Libtool专属标志
利用configure的--with-libtool-flags参数,专门给Libtool传递链接器标志,这样configure测试阶段使用原始LDFLAGS,Libtool链接时自动带上包装后的标志:
export CC=clang export CFLAGS="-target your-target-triple" export LDFLAGS="-target your-target-triple" # 配置时指定Libtool需要的特殊标志 ./configure --host=your-target-triple --with-libtool-flags="-XCClinker -target your-target-triple" make
方法3:使用Clang专属环境变量传递链接标志
Clang支持CLANG_LINKER_FLAGS环境变量,用于专门传递链接器参数,Libtool不会处理这个变量,会直接传递给Clang:
export CC=clang export CFLAGS="-target your-target-triple" # 用CLANG_LINKER_FLAGS传递链接阶段的-target标志 export CLANG_LINKER_FLAGS="-target your-target-triple" ./configure --host=your-target-triple make
内容的提问来源于stack exchange,提问作者Tomeamis
相关产品推荐
相关产品推荐

