用CMake检测字节序

Fre*_*den 10 cmake endianness

我的库需要读入大端整数(4字节)并将它们转换为主机的字节序以进行处理.虽然on*nix ntohl在Windows下使用过,但ntohl需要使用Ws2_32.dll(Winsock).

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

由于似乎没有标准的预处理器定义用于endianess,似乎有必要使用我的构建系统(cmake)来确定它.这样做的最佳方法是什么?(我厌倦了'编译一个测试文件并看到'类型解决方案,因为它们似乎会禁止交叉编译.)

The*_*ube 11

此CMake功能也可以这样做,http://www.cmake.org/cmake/help/v3.5/module/TestBigEndian.html

include (TestBigEndian)
TEST_BIG_ENDIAN(IS_BIG_ENDIAN)
if(IS_BIG_ENDIAN)
 message(STATUS "BIG_ENDIAN")
else()
 message(STATUS "LITTLE_ENDIAN")
endif()
Run Code Online (Sandbox Code Playgroud)

我认为只有CMake 3.0支持


wkl*_*wkl 7

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

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

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

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

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

如果你想要编译时间确定系统字节顺序,除了"构建一个测试程序然后编译我的真实程序" cmake,或者对编译器定义的特定宏(例如__BIG_ENDIAN__GCC 4)进行详尽的检查之外,我没有看到太多选择. X.

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