Обнаружение Endianness с CMake - PullRequest
10 голосов
/ 07 октября 2010

Моей библиотеке нужно прочитать целые числа с прямым порядком байтов (4 байта) и преобразовать их в порядок байтов хоста для обработки. В то время как на * nix ntohl работает под Windows, использование ntohl требует использования Ws2_32.dll (Winsock).

Такую зависимость я бы скорее исключил. Простейший способ сделать это, кажется, написать мою собственную функцию обмена порядком байтов (тривиальное упражнение, учитывая, что производительность не является реальной проблемой). Однако для этого требуется способ определения порядка в системе, в которой выполняется компиляция моей библиотеки (поэтому я могу #ifdef отключить функцию замены в системах с прямым порядком байтов).

Поскольку не существует стандартного определения препроцессора для порядка байтов, кажется, что его необходимо определить с помощью моей системы сборки (cmake). Как лучше всего это сделать? (Я устал от «скомпилировать тестовый файл и посмотреть» решения типа, так как они могут препятствовать кросс-компиляции.)

Ответы [ 2 ]

11 голосов
/ 19 марта 2015

Также эта функция 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()

Я думаю, что поддерживается только из CMake 3.0

7 голосов
/ 07 октября 2010

Отредактировано: я вижу, что 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

...