新装Clang无法找到默认库?C++编译链接报错求助
解决Clang编译C++代码时的链接错误问题
这是个很常见的坑——你用clang命令编译C代码,但它默认是C语言编译模式,不会自动处理C标准库和数学库的链接依赖,而g++会帮你自动搞定这些环节。下面是具体的解决步骤:
1. 把clang换成clang++
clang是针对C语言的编译器驱动,clang++才是专门用于C++的版本,它会自动链接C标准库(比如系统默认的libstdc++),直接解决你看到的std::chrono、std::thread、std::ios_base这类C标准库的未定义引用问题。
修改你的编译命令为:
clang++ -DLinux -fPIC -pthread tsfoo.o -Wall -Wno-parentheses -Werror -L../../release/Linux5.3.7-301.fc31.x86_64/lib -L/usr/X11/lib -L/X/lib -L/X/lib -latomic -lFooDebug -lFooTopDebug -o tsfoo
2. 添加-lm链接数学库
从报错里的log10、pow未定义引用来看,你还需要显式链接数学库libm,在命令末尾加上-lm参数:
clang++ -DLinux -fPIC -pthread tsfoo.o -Wall -Wno-parentheses -Werror -L../../release/Linux5.3.7-301.fc31.x86_64/lib -L/usr/X11/lib -L/X/lib -L/X/lib -latomic -lFooDebug -lFooTopDebug -lm -o tsfoo
为什么会出现这个问题?
g++作为GNU的C编译器,默认会自动关联C标准库和数学库,所以你用它编译时不会触发这类错误。clang默认是C语言编译模式,不会自动引入C相关的库依赖,必须用clang++来触发C编译流程,它会自动添加C++标准库的链接选项。- 数学库
libm在C/C++编译中有时需要显式链接,g++帮你隐式处理了,但clang++可能需要你手动声明,加上-lm可以彻底解决数学函数的未定义引用问题。
额外验证方法
如果修改后还有疑问,可以加上-v参数查看完整的链接命令,确认编译器是否正确引入了所需的库:
clang++ -v -DLinux -fPIC -pthread tsfoo.o -Wall -Wno-parentheses -Werror -L../../release/Linux5.3.7-301.fc31.x86_64/lib -L/usr/X11/lib -L/X/lib -L/X/lib -latomic -lFooDebug -lFooTopDebug -lm -o tsfoo
内容的提问来源于stack exchange,提问作者Swiss Frank
相关产品推荐
相关产品推荐

