MacOS 13+XCode14下g++编译简单C++文件报错求助
问题:Apple Clang编译C++文件时abs声明冲突
环境信息
- 设备:M2 Mac Mini
- Xcode版本:14.2
- 编译器:系统
g++实际为Apple Clang,需使用c++命令编译
测试代码
#include <limits> #include <cmath> #include <algorithm> int main(int argc, char **argv) { return 0;}
背景设置
因Catalina之后Xcode的g++无法自动识别标准头文件和库路径,手动设置了环境变量:
% echo $LIBRARY_PATH /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/lib % echo $CPATH /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include
错误信息
编译时出现abs声明冲突,移除<cmath>或<algorithm>其中一个即可正常编译,错误输出如下:
% /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++ conftest.cpp In file included from conftest.cpp:4: In file included from /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/algorithm:653: In file included from /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/functional:499: In file included from /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/__functional/bind_back.h:15: In file included from /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/__functional/perfect_forward.h:17: In file included from /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/tuple:159: In file included from /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/__functional_base:22: In file included from /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/exception:83: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/cstdlib:130:9: error: target of using declaration conflicts with declaration already in scope using ::abs _LIBCPP_USING_IF_EXISTS; ^ /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/stdlib.h:132:6: note: target of using declaration int abs(int) __pure2; ^ /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/cmath:338:1: note: conflicting declaration using ::abs _LIBCPP_USING_IF_EXISTS; ^
解决方法
移除自定义CPATH和LIBRARY_PATH
Apple Clang配合Xcode或Command Line Tools时,会自动通过SDK路径加载正确的头文件和库,手动设置这两个变量会导致C标准头文件与libc的C头文件符号冲突,删除即可恢复正常编译。通过编译参数指定SDK(若需手动指定)
如果必须指定SDK路径,不要依赖环境变量,改用编译参数传递:/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++ -isysroot /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk conftest.cpp更新Xcode版本
Xcode 14.2存在libc++与系统头文件的兼容性问题,升级到14.3及以上版本可修复此类符号冲突。
内容的提问来源于stack exchange,提问作者GaryO
相关产品推荐
相关产品推荐

