Go交叉编译std库为shared模式时警告被视为错误问题咨询
问题1:为什么CFLAGS/CXXFLAGS不生效
Go工具链不会读取系统默认的CFLAGS、CXXFLAGS变量传递给CGO编译环节,必须使用CGO专属的环境变量传递编译参数,对应C代码用CGO_CFLAGS,C++代码用CGO_CXXFLAGS,所以你之前的普通参数设置无效,后续使用CGO_CFLAGS="-Wno-error"的方向是正确的。
问题2:新增类型转换报错的根源
你出现第二个报错的核心原因是错误将C编译器指定为了g++:
- runtime/cgo的源码是纯C代码,C标准允许
void*隐式转换为任意指针类型,因此nil定义为((void*)0)传给nanosleep的第二个参数是完全合法的C代码 - g是C编译器,C++标准不允许
void*隐式转换为其他指针类型,因此会抛出类型转换错误,这不是cgo代码的bug,是编译器使用错误导致的。
完整解决方案
修正编译命令中的CC变量,将C编译器改为对应架构的gcc,g仅用于指定CXX变量(供C代码编译使用),示例命令如下:
CGO_ENABLED=1 CC=/custom/path/to/arm-linux-gnueabi-gcc CXX=/custom/path/to/arm-linux-gnueabi-g++ GOARCH=arm GOARM=5 go install -buildmode=shared -v std
如果调整编译器后仍然出现-Werror相关的警告拦截,可额外追加CGO_CFLAGS="-Wno-error"参数即可。
关于是否需要提交Bug工单
不需要提交Bug,该问题是用户侧编译配置错误导致,cgo代码本身符合C语言标准,无逻辑问题。
内容的提问来源于stack exchange,提问作者Daniel
相关产品推荐
相关产品推荐

