2013-02-25 74 views
5

我有一个需要在Windows,Linux和VxWorks上构建的项目。该项目建立在Linux和Windows上,但是针对VxWorks进行交叉编译。为了处理跨多个平台的字节序,它使用ntoh.h. Linux机器是小端,但ntohl不交换我的程序。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)); 

从这些输出两行产生相同的输出。 TESTING DEADBEEF deadbeef deadbeef

+2

请添加实际无法正常工作的代码。 – wRAR 2013-02-25 21:55:11

+1

从你的编辑中,'printf(“%x”,0xdeadbeef)'产生'efbeadde'怎么可能?您可能想要发布一个显示真实代码的最简单示例。 – 2013-02-25 22:18:55

+0

@奥斯汀菲利普斯:对不起,你是对的。输出描述是固定的。 – Kat 2013-02-25 22:23:19

回答

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) 
+0

这些标志正是我所需要的。我的软件调用了一个陈旧的ntoh.h文件,其中没有包含**错误不应该在这里**和** LINUX **定义检查。过时的文件将ntohl(x)定义为(x)! 我更新了我的makefile以正确清理。 陈旧的文件已被删除。 – Kat 2013-02-26 15:36:49