Clang在OS X Lion下找不到cstdint。

18

我正在尝试编译一个使用cstdint的应用程序。由于苹果公司已经弃用了gcc,我想尝试使用clang来进行编译,但是我遇到了以下错误:

fatal error: 'cstdint' file not found

我知道gcc 4.6.2版本有-std=c++0x选项,可以包含该库,但由于os x版本是4.2,所以在这里不太可行。你有什么建议可以帮助我前进吗?我尝试安装4.6.2版本,但在编译一些需要的库之前构建gcc时遇到了各种问题。


我成功地在Mac OS X 10.7.3上编译了GCC 4.7.0,没有遇到太多麻烦。我相信我使用了苹果的GCC来引导编译,而不是我的4.6.1版本。如果你需要帮助,请联系我(请参阅我的个人资料)。(我尝试过4.6.2和4.6.3,但未成功。) - Jonathan Leffler
1个回答

18

假设你有这个应用程序的源代码,因此你可以修改头文件以包含正确的cstdint头文件,因为Clang 3.0(Lion工具自带)具有该头文件。

快速解决方案

头文件在tr1目录下,因此您需要执行以下任一操作之一:

#include <tr1/cstdint>

或者

#include <stdint.h> // which will use the C99 header

更长、更无聊的解释

自从我记得你可以不使用tr1目录来做到这一点之后,我又进行了一些额外的阅读:

默认情况下,您将包括来自/usr/include/c++/4.2.1的C++头文件,这些是GNU GCC头文件。 /usr/include/c++/4.2.1/tr1 包含TR1头文件,例如 cstdint

替代方法是使用Clang++前端编译并传递-stdlib=libc++标志,它将使用位于/usr/include/c++/v1的头文件,这些是Clang的C++头文件实现之一。其中包括cstdint

示例:

// file called example.cxx
#include <tr1/cstdint>

int main() {
    // whatever...
}

请使用以下命令进行编译:

g++ example.cxx
或者
clang++ example.cxx

它将会做你想要的事情。

如果你不想使用 tr1 版本(即使它可能是粗略地相同,如果不是完全相同):

// file called example.cxx
#include <cstdint>

int main() {
    // stuff
}

这是这样编译的:

clang++ -stdlib=libc++ example.cxx
尽管如果你使用-stdlib=libc++,那么意味着你正在链接到Clang的C ++库libc++,而不是GCC的libstdc++

Clang在使用-std=c++11标志时不使用GCC的C++11实现。也许捆绑的GCC stdlib已经过时了。但是当然,GCC有<cstdint> - Potatoswatter
@Potatoswatter - 在Mac OSX上捆绑的GCC库被冻结在4.1.2版本,因为该版本与随后的版本之间的许可证更改,所以它有点过时。如果您想在Mac上获得更好的C++11支持,您的选择是安装更新的GCC或使用Clang实现。 - wkl
2
我在Ubuntu 14.04上遇到了这个错误,我不得不安装libc++-dev来获取开发文件。然后-stdlib=libc++就可以正常工作了。 - nathancahill

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接