cmake - 使用 CMake 检测字节顺序

标签 cmake endianness

我的库需要读入 big-endian 整数(4 字节)并将它们转换为主机的 endian 顺序进行处理。在 *nix 上时 ntohl在 Windows 下使用了 ntohl需要使用 Ws2_32.dll (温索克)。

这种依赖是我宁愿消除的依赖。最简单的方法似乎是编写我自己的字节序交换函数(一个微不足道的练习,考虑到性能并不是真正的问题)。但是,这需要一种方法来确定正在编译我的库的系统的字节序(因此我可以 #ifdef 在大字节序系统上输出交换函数)。

由于似乎没有用于字节序的标准预处理器定义,因此似乎有必要使用我的构建系统 (cmake) 来确定它。这样做的最佳方法是什么? (我厌倦了“编译测试文件并查看”类型的解决方案,因为它们似乎会抑制交叉编译。)

最佳答案

编辑:我看到了 cmake有一个 TestBigEndian.cmake脚本,但这会进行编译和测试运行以查看系统是否为 Big Endian,这不是您想要做的。

您可以使用这样的函数在自己的程序中检查系统的字节序。

bool isLittleEndian()
{
    short int number = 0x1;
    char *numPtr = (char*)&number;
    return (numPtr[0] == 1);
}

基本上创建一个整数,并读取它的第一个字节(最低有效字节)。如果该字节为 1,则系统为小端,否则为大端。

但是,这不允许您在运行时之前确定字节顺序。

如果您想确定系统字节序的编译时间,除了“构建一个测试程序然后编译我的真实程序”之外,我看不到太多替代方案,如 cmake ,或对编译器定义的特定宏进行详尽检查,例如__BIG_ENDIAN__在 GCC 4.x 上。

更新 您可能想看看 Boost 自己的 endian.hpp也举个例子。
http://www.boost.org/doc/libs/1_43_0/boost/detail/endian.hpp

关于cmake - 使用 CMake 检测字节顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3877344/

相关文章:

endianness - 从使用大端到小端的转换过程有多快?

css - 为什么 lessc 将文件编码为 UCS-2 Little Endian?

unix - Unix hexdump 中的字节序

cmake - 使用 CMake 和 PkgConfig 链接库

c++ - CMake:如何禁用单个 *.cpp 文件的优化?

function - CMake:如何从函数内部修改变量

cmake - 如何从 CMake 中的 'find_path' 结果中删除组件?

c++ - 如何在基于 CMake 的项目中使用 Boost.Test?

c - 确定 C 语言机器体系结构的正确方法

python - C 和 Python 之间的 Unix 套接字