我有一个项目需要在Windows、Linux和VxWorks上构建。该项目在Linux和Windows上构建,但是为了在VxWorks上交叉编译,需要使用ntoh.h处理跨多个平台的字节序。Linux机器是小端字节序,但我的程序中的ntohl函数未执行交换操作。
我编写了一个测试程序,直接包含in.h,能够正确地进行交换操作。我还编写了另一个测试程序,只包含ntoh.h,也能够正确地进行交换操作。这两个测试程序都链接到lib64/libc.so.6库。
然而,在编译我的项目时,ntohl函数却未执行交换操作。我无法使用gdb命令“break ntohl”来中断ntohl函数。在构建时,我看到LITTLE ENDIAN警告(如下所示),但没有看到"SHOULDNT BE HERE"错误。
请帮忙解决。我不明白为什么会出现这个问题。
以下是ntoh.h代码:
错误是由以下行生成的:
我编写了一个测试程序,直接包含in.h,能够正确地进行交换操作。我还编写了另一个测试程序,只包含ntoh.h,也能够正确地进行交换操作。这两个测试程序都链接到lib64/libc.so.6库。
然而,在编译我的项目时,ntohl函数却未执行交换操作。我无法使用gdb命令“break ntohl”来中断ntohl函数。在构建时,我看到LITTLE ENDIAN警告(如下所示),但没有看到"SHOULDNT BE HERE"错误。
请帮忙解决。我不明白为什么会出现这个问题。
以下是ntoh.h代码:
#ifndef __ntoh__
#define __ntoh__
#include "basic_types.h"
#ifdef WIN32
#include <winsock2.h>
#elif LINUX
#include <netinet/in.h>
//This is here to determine what __BYTE_ORDER is set to in netinet/in.h.
// Not in original code
#if __BYTE_ORDER == __BIG_ENDIAN
#warning BIG ENDIAN BYTE ORDER!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
#endif
//This is here to determine what __BYTE_ORDER is set to in netinet/in.h.
// Not in original code
#if __BYTE_ORDER == __LITTLE_ENDIAN
#warning YAY LITTLE ENDIAN!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
#endif
#else
#error SHOULDNT BE HERE //added for debugging purposes
#define ntohl(x) (x)
#define ntohs(x) (x)
#define htonl(x) (x)
#define htons(x) (x)
#endif
#endif // __ntoh__
我的编译命令的一部分:
g++ -DDAU_PARSER -DNO_MT -DTEST_CLOCK -DLINUX -g -Irelease/include -Irelease/include/Record_Data/ -Irelease/include/Utility -o dauParser DAU_Support_Tools/src/dau_parser.cpp DAU_Support_Tools/src/dau_parser_write_data_to_file.cpp Utility/src/Messaging/Communications/Message.cpp Utility/src/time_type.cpp Utility/src/collectable.cpp Utility/src/clist.cpp Utility/src/clock.cpp Utility/src/test_clock.cpp Utility/src/mutex.cpp Utility/src/ntoh.cpp ...
错误是由以下行生成的:
int deadbeef = 0xDEADBEEF;
printf("TESTING DEADBEEF %x %x\n", deadbeef, ntohl(deadbeef) );
这两行代码的输出结果相同。 测试 DEADBEEF deadbeef deadbeef
printf("%x", 0xdeadbeef)
怎么可能输出efbeadde
?你可能需要发布一个最小示例来展示你的真实代码。 - Austin Phillips