我有一个需要build立在Windows,Linux和VxWorks上的项目。 该项目build立在Linux和Windows上,但交叉编译VxWorks。 为了处理跨多个平台的字节序,它使用ntoh.h. Linux机器是小端,但ntohl不会交换我的程序。
我写了一个testing程序,直接包含in.h. 交换适当。 我写了另一个testing程序,包括ntoh.h。 交换适当。 这两个testing程序链接到lib64 / libc.so.6。
但是,当我编译我的项目,ntohl不交换。 我不能使用gdb“break ntohl”命令在ntohl上打破。 在build设时,我看到了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) );
这两行的输出产生相同的输出。 testing死亡deadbeef deadbeef
这两行的输出产生相同的输出。 测试死亡deadbeef deadbeef
那么有些事情是错的,但我们不能告诉你什么。 你必须调试这个问题,因为你是唯一可以观察它的人。
从最简单的例子开始:
cat tc; gcc tc && ./a.out #include <netinet/in.h> #include <stdio.h> int main() { int deadbeef = 0xDEADBEEF; printf("TESTING DEADBEEF %x %x\n", deadbeef, ntohl(deadbeef)); return 0; } TESTING DEADBEEF deadbeef efbeadde
这是否产生了预期的结果?
gcc -dD -E -DLINUX ntoh.cpp
,看看ntohl
宏扩展到什么地方,它来自哪里。 我的猜测是,你有一些愚蠢的标题之一,例如
#undef ntohl #define ntohl(x) (x)