编译第三方SDK示例应用时找不到C++标准库头文件<algorithm>
<algorithm>的问题 看起来你在用LLVM 3.8.0的clang++编译第三方SDK示例时遇到了标准库头文件找不到的问题,我帮你拆解下可能的原因和解决办法:
1. 先修正编译参数的低级语法错误
你的编译命令里有个明显的问题:-isystem/opt/tbricks/sdk/include64 这里缺少空格!-isystem是编译器选项,后面必须跟空格再指定路径,否则clang会把isystem/opt/tbricks/sdk/include64当成一个无效的选项名,不仅起不到添加系统头文件路径的作用,还可能干扰编译器的正常搜索逻辑。
先把这个参数改成:-isystem /opt/tbricks/sdk/include64
2. 确保编译器能找到系统C++标准库
LLVM 3.8.0是比较老的版本(2016年发布),它可能需要显式指定C++标准库的类型和路径:
- 如果你的系统用的是GNU的
libstdc++(大部分Linux发行版默认),在编译命令中添加-stdlib=libstdc++参数; - 如果想使用LLVM自己的
libc++,添加-stdlib=libc++,但要确保已经安装了libc++的开发包(比如libcxx-devel之类的,取决于你的发行版)。
另外,你可以添加 -v 参数让clang输出详细的头文件搜索路径,这样能直观看到编译器有没有在系统标准库路径里找头文件。比如运行:
/opt/llvm-3.8.0/bin/clang++ -v -xc++ -E - <<EOF #include <algorithm> EOF
如果输出里没有出现系统C++标准库的路径(比如/usr/include/c++/x.x或者LLVM自带的/opt/llvm-3.8.0/include/c++/v1),那说明编译器没关联到标准库,需要检查LLVM安装是否完整,或者手动添加标准库路径的-I参数。
3. 显式指定C++标准版本
虽然<algorithm>在C98里就存在,但显式指定标准版本可以避免编译器默认设置的潜在问题。针对clang 3.8.0,你可以添加 -std=c++11 或者 -std=c++14(它支持到C14),比如:
-std=c++11
4. 检查头文件搜索顺序的干扰
你的编译命令里有多个 -I 参数指向上级目录,还有-isystem指向SDK路径。-isystem的优先级比普通-I高,但系统标准库的路径应该是默认优先级最高的。如果通过-v输出发现系统标准库路径被挤到后面甚至没出现,可能需要调整参数顺序,或者暂时去掉一些-I参数测试,看是不是路径覆盖导致的问题。
修正后的示例编译命令
把上面的修改整合后,你的命令大概会变成这样:
if [ ! -d .deps/ ]; then mkdir -p .deps/; fi && /opt/llvm-3.8.0/bin/clang++ -v -std=c++11 -stdlib=libstdc++ -M -isystem /opt/tbricks/sdk/include64 -I../../.. -I../../../.. -I./../../../.. -DLINUX -DLINUX64 -DTB_USE_RCU -DURCU_INLINE_SMALL_FUNCTIONS -DU_USING_ICU_NAMESPACE=0 -DNDEBUG -D_POSIX_PTHREAD_SEMANTICS -fPIC -D_GNU_SOURCE -DTB_USE_RCU -DTB_USE_RCU -D_GLIBCXX_USE_...
(注意加了&&连接mkdir和clang++命令,避免mkdir失败后还继续编译)
先按这个思路排查,应该能解决找不到<algorithm>的问题。
内容的提问来源于stack exchange,提问作者intrigued_66

