我有一个需要在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:
#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
答案 0 :(得分:6)
这两行的输出产生相同的输出。测试DEADBEEF deadbeef deadbeef
嗯, 错误,但我们无法告诉你什么。 您必须调试此问题,因为您是唯一可以观察它的人。
从最简单的例子开始:
cat t.c; gcc t.c && ./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)